2012-12-19 49 views
3

我試圖做一個mongo查詢,在這裏我得到了每個文檔中數組的長度,而沒有檢索列表的全部內容。理想情況下,這將是沿着這些線的投影選項:在MongoDB中檢索列表的長度

db.log.find({},{entries:{$length: 1}}) 

但是這不被支持。也許這可以用新的聚合框架以優雅的方式進行?我想出來的是這樣的:

db.log.find({},{"entries.length": 1}) 

它返回這樣的結果:

{ "_id" : ObjectId("50d2fb07e64cfa55431de693"), "entries" : [ { },  { },  { },  { },  { },  { },  { },  { }, { },  { },  { },  { },  { },  { }, { },  { },  { },  { } ] } 

這是醜陋的,但基本上我的服務需求,因爲我可以算這個列表的長度沒有網絡獲得完整內容的重量。但我不知道爲什麼這會起作用。這個查詢究竟在做什麼?現在

+0

我相信這是返回數組中的每個元素的'length'場 - 因爲這大概不是爲任何人設置,您會爲數組的每個元素獲得一個空對象。 – drevicko

回答

5

,我能想到的兩種技術途徑:

1)使用聚合框架:

db.log.aggregate([ { $unwind : "$entries" }, { $group : { _id : "$_id", entries : {$sum:1} } } ]); 

2),或者你可以添加一個字段來保存條目數文檔。因此,每次您向條目數組推送新值時,都必須遞增計數器。該更新將是這樣的:

db.log.update({ _id : 123 }, { $push : { entries : 'value' }, $inc : { entriesCount : 1 } }) 

顯然,你有一個權衡這裏:聚合框架是這樣簡單的操作過於昂貴。但是爲文檔添加一個字段,每次更新都應該增加計數器。

恕我直言,計數器看起來更合理,但它看起來是一種解決方法。