我有两个模式:
var categorySchema = mongoose.Schema({
title: String,
blogs: [{ type: ObjectId, ref: 'Blog' }]
})
var blogSchema = mongoose.Schema({
title: String,
description: String,
category: [{ type: ObjectId, ref: 'Category' }],
created: {type: Number, default: new Date().getTime()}
})
var Category = mongoose.model('Category', categorySchema)
var Blog = mongoose.model('Blog', blogSchema)
他们是交叉引用:
Category
个对象(refs),以便能够获取此博客所涉及的所有类别。Blog
个对象(refs)数组,以便能够获取此类别的所有博客。问题是当我尝试获得某个博客时。我需要填充类别数组来获取它的标题:
Blog
.findOne({_id: _._id})
.populate('category')
.exec(function (err, __) {
callback(err, __);
})
我明白了......
{ title: 'My Blog',
description: 'description',,
_id: 51cb6bd845ba145e02000001,
__v: 0,
created: 1372285906662,
category:
[ { __v: 0,
_id: 51cb5ed6fd63867905000002,
priority: 3,
title: 'Music',
blogs: [Object] } ],
}
是的,我获得了类别标题,但我也在博客中获得了一些对象 - 它们也被填充了。但Blog-objects可能包含很多子对象(帖子),我们还记得category
字段。那么,类别字段中的所有对象都将以递归方式填充,因为我在Blog和Category之间有交叉链接,它将在循环中填充?
如何限制人口水平?我不想要填充博客/类别[n] / blogs: []
,只需要直接category
字段,例如title
。感谢。
答案 0 :(得分:2)
值得商榷的是,我们确实需要两组指针 不同步。相反,我们可以跳过填充并直接找到() 我们感兴趣的故事。
我会删除类别架构中的博客引用,只查询您感兴趣的文档。
“Blog对象包含一个Category对象(refs)数组,以便能够获取此博客与之相关的所有类别”:
Blog.findOne({_id: blogId})
.populate('category')
.exec(function (err, blog) {
callback(err, blog);
//blog.category is the array you want
})
“类别对象包含一组Blog对象(refs),以便能够获取此类别的所有博客”:
Blog.find({category: catId})
.exec(function (err, blogs) {
callback(err, blogs);
})
这是$all query的简化语法,它实际在类别数组中搜索指定的id。