2011-07-17 143 views
38
查詢內部數組大小

users收集考慮一個MongoDB的文檔:MongoDB中

{ username : 'Alex', tags: ['C#', 'Java', 'C++'] } 

有什麼辦法,來從服務器端tags數組的長度(不通過標籤之客戶端) ?

謝謝!

回答

15

現在的MongoDB(2.6版本)聚集supports$size操作。

從文檔:

{ <field>: { $size: <array> } } 

你要能夠實現與任何使用此以下內容:

db.users.aggregate(
    [ 
     { 
     $group: { 
      _id: "$username", 
      tags_count: {$first: {$size: "$tags" }} 
     } 
     } 
    ] 
) 

db.users.aggregate(
    [ 
     { 
     $project: { 
      tags_count: {$size: "$tags"} 
     } 
     } 
    ] 
) 
+6

我不認爲你可以使用$ size操作符就像這樣使用$ group。 $ size不在[聚合運算符]之間(http://docs.mongodb.org/manual/reference/operator/aggregation-group/)。 相反,你可以使用投影如果你不需要分組: db.test.aggregate({$項目:數:{$尺寸: 「$標籤」}}) OR 如果需要分組,如下所示: db.test.aggregate({$ group:{_id:「$ userName」,count:{$ sum:{$ size:「$ tags」}}}}) –

+0

有趣的是沒有人抱怨關於它之前,謝謝 – anvarik

+0

當我有這樣的事情時,怎麼可能得到:{username:'Alex',tags:[[''C#','Java','C++']]} 我們怎麼得到現在標籤的長度/大小? – rkatkam

9

目前,唯一的辦法就是使用db.eval,但是這個locks database for other operations

最快速度的方法是添加一個額外的字段來存儲數組的長度,並將其保留$inc$push操作。

+0

非常感謝。是的,我也想過把尺寸保持在一個單獨的領域,但希望有更好的方法。 –

15

我認爲使用$inc或者通過計劃中的工作來計算每次保存(作爲單獨字段)的標籤數量可能更有效。

你也可以用map/reduce(canonical example)做到這一點,但這似乎不是你想要的。

我不知道這是可以做到的正是你所問的,但可以查詢所有符合一定規模與$size,這些文件...

> db.collection.find({ tags : { $size: 3 }}); 

這會得到大家的與3個標籤文件...

+0

謝謝你的$大小提示,賈斯汀。 –

29

如果用戶名爲亞歷克斯是獨一無二的,你可以使用下面的代碼:

db.test.insert({username:"Alex", tags: ['C#', 'Java', 'C++'] }); 
db.test.aggregate(
    {$match: {username : "Alex"}}, 
    {$unwind: "$tags"}, 
    {$project: {count:{$add:1}}}, 
    {$group: {_id: null, number: {$sum: "$count" }}} 
); 
{ "result" : [ { "_id" : null, "number" : 3 } ], "ok" : 1 } 
+1

謝謝。這個問題在聚合框架無法使用時被問到,但現在它非常合理。 –

10

xmm.dev的回答可以簡化爲:而不必中間體領域「合作UNT」,你可以在$組直接總結:

db.test.aggregate(
    {$match: {username : "Alex"}}, 
    {$unwind: "$tags"}, 
    {$group: {_id: null, number: {$sum: 1 }}} 
) 
0

我做了周圍的小工作因爲我需要查詢數組大小並返回它是否大於0,但可以是1-3之間的任何值。

這裏是我的解決辦法:

db.test.find($or : [{$field : { $exists : true, $size : 1}}, 
        {$field : { $exists : true, $size : 2}}, 
        {$field : { $exists : true, $size : 3}}, ]) 

當屬性存在,大小爲1這基本上返回一個文件,2或3。用戶可以添加更多的語句和增量,如果他們正在尋找一個具體大小或範圍內。我知道它並不完美,但它確實有效,速度相對較快。我的屬性中只有1-3個尺寸,所以此解決方案可以工作。