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) 

它们是交叉引用的:

  1. Blog对象包含一个Category对象(ref)的数组,以便能够获取与该博客相关的所有类别。
  2. 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。