У меня возникли проблемы с пониманием некоторых концепций методов mongoose populate. Сначала у меня работал встроенный подход, хотя, поскольку я опасался больших накладных расходов на данные и несинхронизированные документы, я попытался изменить парадигму на ref
другие документы.
Моя схема похожа на следующую (удалены ненужные свойства):
var userSchema = mongoose.Schema({
name: {type: String, default:''},
favorites:{
users:[{type: Schema.Types.ObjectId, ref: this}],
places:[{type: Schema.Types.ObjectId, ref: PlaceSchema}]
}
});
module.exports = mongoose.model('User', userSchema);
Теперь я пытаюсь получить User
favorites
следующим образом:
User.findOne({_id: currentUser}).exec(function(err, user){
console.log(user);
if (err)
throw err;
if(!user){
console.log("can't find user");
}else{ // user found
user.populate('favorites.users');
user.populate('favorites.places');
// do something to the 'user.favorites' object
}
});
Хотя это не работает должным образом, поскольку и user.favorites.users
, и user.favorites.places
оказываются неопределенными.
Я думал, что смогу заполнить, как указано выше, но, видимо, это не так. Из того, что я прочитал, я должен упустить что-то, указывающее (возможно) на модель ref
ed документа? Этот поток очень нов для меня, и я немного потерян.
Могу ли я в любом случае получить массив users
и places
, заполнив результат моего запроса, как указано выше? Я пробовал populate
в цепочке с exec
, и это тоже не работает. Есть ли лучший способ достичь этого результата?
РЕДАКТИРОВАТЬ: В случае необходимости в БД документ User
отображается как:
{
"_id": "56c36b330fbc51ba19cc83ff",
"name": "John Doe",
"favorites": {
"places": [],
"users": [
"56b9d9a45f1ada8e0c0dee27"
]
}
}
РЕДАКТИРОВАТЬ: Еще пара деталей... В настоящее время я сохраняю/удаляю ссылочные ObjectIds, подобные этому (обратите внимание, что targetID - это строка):
user.favorites.users.push({ _id: mongoose.Types.ObjectId(targetID)});
user.favorites.users.pull({ _id: mongoose.Types.ObjectId(targetID)});
Кроме того, мне нужно заполнить users
и places
соответствующими документами также, я думаю, что это может быть неясно в моем исходном вопросе.
ref
должно быть именем модели, на которую ссылаются, а не схемы. - person JohnnyHK   schedule 16.03.2016