我无法理解mongoose populate方法背后的一些概念。我首先使用嵌入式方法,但是,由于我担心数据和不同步文档的大量开销,我尝试将范例更改为 controller('PlaylistCtrl', function($scope, $stateParams, $sceProvider) {
$sceProvider.enabled(false); //this will cause CORS vulnerabilities.
$scope.playlistSet = [
[
{ track: 'Iris', artist: 'Sleeping with the Sirens', video: 'http://www.youtube.com/watch?v=cyOqIKGbYkg'}
]
$scope.id = $stateParams.playlistId;});
其他文档。
我的架构类似于以下内容(删除了不相关的属性):
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
{/ p>}:
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
和users
的数组吗?我尝试places
与populate
链接,但它也无法正常工作。有没有更好的方法来实现这个结果?
编辑:如果需要,在数据库中,exec
文档显示为:
User
编辑:更多细节...我目前正在存储/删除像这样的引用ObjectIds(注意targetID是一个字符串):
{
"_id": "56c36b330fbc51ba19cc83ff",
"name": "John Doe",
"favorites": {
"places": [],
"users": [
"56b9d9a45f1ada8e0c0dee27"
]
}
}
另外,我需要填充user.favorites.users.push({ _id: mongoose.Types.ObjectId(targetID)});
user.favorites.users.pull({ _id: mongoose.Types.ObjectId(targetID)});
和users
及其各自的文档以及,我认为在我原来的问题中可能并不清楚。
答案 0 :(得分:1)
尝试:
User
.findOne({_id: currentUser})
.populate('favorites.users')
.populate('favorites.places')
.exec( function (err, user) {
// user.favorites.users
// user.favorites.places
});
答案 1 :(得分:0)
好吧,我通过适当关注文档(以及@DJeanCar' s(+ 1' d)帮助/指针)找出了我需要的东西。
Mongoose的docs关于跨多个级别填充,我已经达成了这个解决方案:
window.location.href
此外,据我所知,如果您需要在填充后过滤所需的文档字段,还可以在window.location.replace('https://www.google.com/');
的选项中传递User.findOne({_id: currentUser})
.populate({path:"favorites.users", populate: "name"})
.populate({path:"favorites.places", populate: "name"})
.exec(function(err, user){
if(err)
throw err;
if(!user){
console.log("couldnt find source user");
}else{
// here, user.favorites is populated and I can do what I need with the data
}
});
。
希望这可以帮助有类似问题的人!