2013-06-26 74 views
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. 博客對象包含Category對象(裁判)的陣列能夠得到這一切的博客相關的類別。
  2. 類別對象包含一個Blog對象(參考)的數組,以便能夠獲取此類別的所有博客。

問題是當我試圖獲得某個博客。我需要填充類陣列來獲得它的標題:

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字段。那麼,類別字段中的所有對象都將遞歸填充,並且由於我在Blog和Category之間存在交叉鏈接,它將填充到循環中?

如何限制人口水平?我不希望Blog/category [n]/blogs: []被填充,只能直接輸入category字段,如title。謝謝。

回答

2

mongoose docs

這是值得商榷的是我們真正想要的兩套指針,因爲它們可能 不同步。相反,我們可以跳過填充,直接找到() 故事我們感興趣的。

我會刪除該類別架構部落格的引用,只是查詢你感興趣的文件。

「博客對象包含類別對象(裁判)的陣列能夠得到這一切的博客相關的類別爲」:

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);       
    }) 

這是實際類別指定id的數組中搜索$all query的簡化語法。