1

我有两个模式:

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对象(refs),以便能够获取与此博客相关的所有类别。
  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] } ],
}

是的,我得到了类别标题,但我也在博客中得到了一些对象——它们也被填充了。但是 Blog-objects 可能包含很多子对象(帖子),并且我们记得categoryfield。那么,类别字段中的所有对象都将被递归填充,并且由于我在博客和类别之间有交叉链接,它将循环填充?

如何限制人口水平?我不想blogs: []填充 Blog/category[n]/,只需要直接category字段,例如title. 谢谢。

4

1 回答 1

2

来自猫鼬文档

值得商榷的是,我们真的想要两组指针,因为它们可能会不同步。相反,我们可以跳过填充并直接 find() 我们感兴趣的故事。

我会删除类别架构中的博客引用,只查询您感兴趣的文档。

“博客对象包含一个类别对象(参考)数组,以便能够获取此博客相关的所有类别”:

Blog.findOne({_id: blogId})
    .populate('category')
    .exec(function (err, blog) {
        callback(err, blog);
        //blog.category is the array you want
    })

“Category 对象包含一个 Blog 对象(refs)数组,以便能够获取该类别的所有博客”:

Blog.find({category: catId}) 
    .exec(function (err, blogs) {
        callback(err, blogs);                        
    })

这是$all 查询的简化语法,它实际上在类别数组中搜索指定的 id。

于 2013-06-27T02:37:49.340 回答