2017-06-16 76 views
1

使用貓鼬,如果我有一個Note模式,我可以檢索排序並分頁使用的find功能查詢選項,像這樣的結果......檢索嵌入文檔分頁結果中貓鼬

Note.find({ creator: creatorId}) 
     .select('text') 
     .limit(perPage) 
     .skip(perPage * page) 
     .sort({ 
      name: 'asc' 
     }) 
     .exec(function(err, notes) { 
      Note.count().exec(function(err, count) { 
       res.render('notes', { 
        notes: notes, 
        page: page, 
        pages: count/perPage 
       }) 
      }) 
     }); 

我可以實現相同的功能(過濾,選擇,限制,忽略,排序等),如果我嵌入父文檔(notesContainerSchema)內Note模式,像這樣:

var noteSchema = new Schema({ 
    creator: { type: String }, 
    text: { type: String } 
}); 

var notesContainerSchema = new Schema({ 
    key: { type: String, unique: true }, 
    notes: [ noteSchema ] // note schema is now an array of embedded docs 
}); 

var NotesContainer = db.model('notesContainer', notesContainerSchema); 
+0

請參閱['$切片'](https://docs.mongodb.com/manual/reference/operator/projection/slice/)。從MongoDB的開始就已經出現了這個特定的目的。 –

+0

我瞭解'$ slice'如何用於'skip'和'limit'。我不知道我怎麼也可以'篩選','選擇'和'排序'數據呢? – CSharp

+1

如果你真的**需要**所有這些操作,那麼保存爲單獨的集合可能會更好。你可以交替使用['$ lookup']](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)而不是'.populate()'來執行「加入」在你需要數據的時候在服務器上。但是對於嵌入,我們可以用數組,「$ filter」等來做「最」的事情。然而像'$ sort'(動態的那樣)仍然需要'$ unwind'。 '$ unwind'意味着在所有情況下的表現痛苦。 –

回答

1

您可以使用aggregation具有:

否deJS,與貓鼬:

NotesContainer.aggregate([{ 
    $project: { 
     notes: { 
      $slice: [{ 
       "$filter": { 
        "input": "$notes", 
        "as": "item", 
        "cond": { "$eq": ["$$item.creator", creatorId] } 
       } 
      }, (perPage * page), perPage] 
     } 
    } 
}, { 
    $unwind: "$notes" 
}, { 
    $sort: { 
     "notes.name": 1 
    } 
}, { 
    $project: { 
     "text": "$notes.text", 
     "_id": 0 
    } 
}]).exec(function(err, notes) { 
    console.log(notes); 
}); 
+2

顯然你需要閱讀['$ slice'](https://docs.mongodb.com/manual/reference/operator/projection/slice/)文檔。請不要在簡單的內置操作員完成工作時提出複雜的彙總語句。 –

+0

感謝您的回覆。我在調用'$ replaceRoot'時返回undefined。我正在使用mlab提供的數據庫,不確定它是否是版本問題。沒有使用'$ replaceRoot'獲得相同結果的更長途徑嗎? – CSharp

+1

查看更新的帖子,'$ replaceRoot'實際上並不需要,我使用@NewLunn建議的'$ slice' –