2012-10-03 101 views
0

我有一個項目模式和集合以及一個列表模式和集合。在貓鼬中使用動態字段

我目前創建項目與創建列表分開......但每個項目都引用一個列表objectId。

var ListSchema = new Schema({ 
    name : { type: String, required: true, trim: true } 
    , user : { type: Schema.ObjectId, ref: 'User', index: true } 
    , description : { type: String, trim: true } 
}); 


var ItemSchema = new Schema({ 
    name : { type: String, required: true, trim: true } 
    , description: { type: String, trim: true } 
    , list : { type: Schema.ObjectId, ref: 'List', index: true } 
}); 

我想知道是否有可能得到一個列表,並加載項該列表ontop的該實例:

所以,我可以這樣做:

list.items得到中的所有項目風景。

//routes/list.js 
List.find({ user: req.params.userid }, function(err, lists){ 
    //i want to populate list.items here 
    res.render('/lists', { lists: lists }); 
}); 

//views/list.ejs 
<% lists.forEach(function(list){ %> 
    List has <%= list.items.length %> items in it 
<% }) %> 

回答

1

它在我看來像你想運行一個查詢的所有項目的list字段等於列表的ID。那是對的嗎?

在這種情況下,像

lists.forEach(function(list){ 
    list.items = [] 
    Item.find({ list:list._id }, function(err, items) { 
     items.forEach(function(item) { 
      list.items.add(item); 
     }); 
    }); 
}); 

可能是你想要什麼。

編輯

啊,我明白了。如何創建列表中的所有_id列表,然後在Item集合上執行$ in查詢以獲取list屬性是您找到的列表之一的所有項目?這隻會是一次調用MongoDB來獲取所有項目,並且您可以將res.render調用放入其回調函數中。

注意:在回調中必須有一些額外的邏輯來解析返回的項目並按列表對它們進行排序。

這裏是docs爲$ in。

+0

這會工作,我想知道是否有更多的mongo-ish方式來做到這一點。或者創建一個List.methods.items函數爲我執行此操作。 – chovy

+0

作者mongo-ish,你的意思是在List集合中的同一個查詢中嗎?既然你想從兩個獨立的集合中獲取數據,你將需要執行兩個查詢。 – shelman

+0

這不起作用,因爲我需要填充list.items後調用res.render()。 Item.find()在一個循環中,這是我必須要做的。 – chovy