mongoose – 如何限制填充()级别的深度?
我有两个模式:
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)
它们是交叉引用的:
- Blog对象包含一个
Category
对象(ref)的数组,以便能够获取与该博客相关的所有类别。 - Category对象包含一个
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] } ], }
是的,我得到类别标题,但我也在博客中得到一些对象 – 他们也填充。 但是,博客对象可能包含很多子对象(文章) ,我们还记得category
字段 。 那么,类别字段中的所有对象都将recursion填充,并且由于我在Blog和Category之间存在交叉链接,它将被填充到一个循环中?
如何限制人口水平? 我不想要Blog / category [n] / blogs: []
被填充,只有直接的category
字段,比如title
。 谢谢。
从mongoose的文档 :
我们真的想要两套指针是有争议的,因为它们可能不同步。 相反,我们可以跳过填充和直接find()我们感兴趣的故事。
我会删除类别模式中的博客参考,只是查询您感兴趣的文档。
“博客对象包含一个类别对象(参考)的数组能够获得这个博客相关的所有类别”:
Blog.findOne({_id: blogId}) .populate('category') .exec(function (err, blog) { callback(err, blog); //blog.category is the array you want })
“类别对象包含一个博客对象(参考)的数组,以获得这个类别的所有博客”:
Blog.find({category: catId}) .exec(function (err, blogs) { callback(err, blogs); })
这是$ all查询的简化语法,它实际上在指定的id的类别数组内search。