2010-07-02 19 views
1

的計數這些文件:MongoDB的:獲取給定數組

db.orders.insert({OrderId:1, OrderItems: [{OrderItemId:1, Qty:1}, {OrderItemId:2, Qty:1} ]}); 
db.orders.insert({OrderId:2, OrderItems: [{OrderItemId:1, Qty:1}, {OrderItemId:2, Qty:2} ]}); 

我想獲得在數量= 1(預期結果3)所有的OrderItems的計數。這是我覺得寫的查詢,但它返回2(1爲每個訂單文檔):

db.orders.find({"OrderItems.Qty":1}).count(); 

我如何可以查詢到找到所有的OrderItems在數量= 1的計數?

回答

2

您可以使用JavaScript:

db.orders.group(
{ 
    key: null, 
    cond: {'OrderItems.Qty':1}, 
    initial: {count: 0}, 
    reduce: function(el, running) 
    {                          
    running.count += el.OrderItems.filter(function(el)              
    {                          
     return el.Qty == 1;                     
    }).length;                        
    }                          
}); 
+0

你能幫我解決在Mongo shell中使用的語法嗎? (mongo.exe) – whitez 2010-07-03 01:01:17

+0

@whitez,我爲此更新了它。 – 2010-07-03 01:16:44

4

只是要清楚別人閱讀此線程。

的OP的命令db.orders.find({"OrderItems.Qty":1}).count();基本上計數其中任何訂單項目有1

數量然而,OP希望所有的OrderItems其中數量是一個計數文件的數量。這裏的問題是我們不計算文檔。我們正在計算文檔中數組內的項目。因此需要javascript和某種形式的特殊的reduce操作。

+0

這是更多的評論或回答?我不理解它是一個答案,但這可能是因爲我不熟悉代碼,但我相信這個答案被標記爲原因 – Huangism 2015-01-22 19:05:07

+0

不,這顯然不是一個答案,而是對這個問題和其他答案的評論。 SO上沒有「線程」,只是問題和答案。這應該是對這個問題的評論。 – Cimbali 2015-01-22 20:49:17

0
db.orders.aggregate([ 
    {$unwind: '@OrderItems'}, 
    {$match : {'OrderItems.Qty':1}}, 
    {$group : { _id : null, 'countOfQty1':{$sum:'$OrderItems.Qty'} }} 
]); 
+0

我認爲這是不對的。有很多錯別字。 – cirrus 2013-04-06 23:12:07

+0

現在是社區wiki。如果你認爲這是不對的,你可以適當地改變它。 – 2013-04-07 09:26:00

0

這應該在沒有JavaScript的shell中這樣做(所以它會更快);

db.orders.aggregate([ 
    {$unwind:'$OrderItems'}, 
    {$match: {'OrderItems.Qty':1}}, 
    {$group : { 
     _id : "Qty1", 
     sum: {$sum:1} 
    }} 
]); 

雖然不幸的是,如果這是一個常見的查詢,那麼您的數據的結構就像這樣。必須做$unwind是相對昂貴的。令人遺憾的是,您的訂單商品不是作爲用訂單ID標記的單獨文檔佈置的,而是包含包含訂單商品數組的訂單ID文檔......換句話說,與您所擁有的相反。處理起來會更容易,更有效率。

相關問題