2017-07-02 246 views
0

我有一個數組中定義的貓鼬模型子文檔如下:如何用Mongoose查找數組元素?

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var schema = Schema({ 
    author: { type: Schema.Types.ObjectId, ref: 'Author' }, 
    pages: [{ 
     number: Number, 
     type: { type: String, enum: ['boring', 'fun']}, 
    }] 
}); 

module.exports = mongoose.model('Book', schema); 

現在我想通過某個作者獲得的所有書籍'fun'的總頁數。我發現許多類似的問題(和答案)討論如何在此場景中找到有趣的頁面的Book,但是我想獲得所有有趣頁面的數組,或者至少是該數組的長度,但如果可能,我想獲取數組本身。我怎樣才能做到這一點?

感謝,

+0

嘗試(未經測試,將新增彷彿正確答案): Book.aggregate( {$放鬆: 「$頁」}, {$組:{ _id: 「$ pages.type」, 計數:{$總和:1} }} ) – nadavvadan

+0

@nadavvadan謝謝!這似乎是工作。但我只是意識到我需要更多的過濾,而不是所有的書籍,我只需要從某些作者的書中進行選擇。如果問題不多,可否請添加? :)再次感謝, – jeff

+0

試試這個:Book.aggregate({$ match:{author:ObjectId(「12-bytes-of-hex」)}},{$ unwind:「$ pages」},{$ group:{ _id:「$ pages.type」,count:{$ sum:1}}}) – nadavvadan

回答

1

我相信,除了語法,這是不言自明:

Book.aggregate(

    { 
     $match: { 
      author: ObjectId("12-bytes-of-hex") 
     } 
    }, 

    { $unwind: "$pages" }, 

    { $group: { 
     _id: "$pages.type", 
     count: { $sum: 1 } 
    }} 
) 
+0

我不明白順便說一句,這是如何根據'type =='fun''過濾頁面? – jeff

+0

它並不完全是這樣;它按頁面類型對頁面進行分組,並統計每個組。您也可以使用mongo的mapReduce框架來獲得'有趣'頁面類型的頁面數量,但我相信上述解決方案更簡單。 – nadavvadan