2016-03-10 74 views
0

這是我的模式。每個用戶都有很多帖子,每個帖子都有用戶收藏的列表。貓鼬/ mongo多對多計算字段

var User = mongoose.model('User', { 
    name: String, 
    posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }] 
}); 

var Post = mongoose.model('Post', { 
    name: String, 
    favorited: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }] 
}); 

我需要選擇帶有布爾標誌的所有用戶帖子是否被收藏。

我已經開始與:

User.findById('56e14680476f47200f1f598e') 
    .populate('posts') 
.then(u => { 
    console.log(u); 
}) 
.catch(console.error.bind(console)); 

輸出:

[ { favorited: [Object], 
     __v: 0, 
     name: 'post 1', 
     _id: 56e14680476f47200f1f5991 }, 
    { favorited: [], 
     __v: 0, 
     name: 'post 2', 
     _id: 56e14680476f47200f1f5992 }, 
    { favorited: [], 
     __v: 0, 
     name: 'post 3', 
     _id: 56e14680476f47200f1f5993 } ], 
    __v: 0, 
    name: 'user 1', 
    _id: 56e14680476f47200f1f598e } 

聚集,地圖,減少,或可能重新設計架構?也許有複雜結構的好例子?在哪裏挖?

回答

1

請試試這個

User.findById('56e14680476f47200f1f598e') 
    .populate('posts') 
    .exec(function(err, user) { 
     if (err) 
      console.log(err); 
     else{ 
      // populate `posts` again 
      Post.populate(user.posts, {path:'favorited', model: 'User'}, function(err, ret) { 
       if (err) 
        console.log(err); 
       else 
        console.log(require('util').inspect(ret, { showHidden: true, depth: null })); 
      }) 
     } 
    }); 

退一步講,如果有垃圾場在User集合,你可以只窩user信息爲Post收集,而不是引用它。

var Post = mongoose.model('Post', { 
    name: String, 
    favorited: [{ name: String, 
       // other fields... 
       }] 
}); 

一個值得關注的是,如果有許多偏愛的用戶可能會使Post集合太大。確保沒有更多的收集限制,16兆字節

無論如何,數據模式應該符合您的數據,並且便於查詢。

+0

你做了第二次填充 - Post.populate(user.posts,..這不會幫助結果是[] – Dizzy

+1

@Dizzy,根據你的文檔,'favorited:[]'爲空,所以沒有用戶以填充... – zangw

+0

不是,請注意收藏:[對象],在'post 1' – Dizzy