在users
收集考慮一個MongoDB的文檔:MongoDB中
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
有什麼辦法,來從服務器端tags
數組的長度(不通過標籤之客戶端) ?
謝謝!
在users
收集考慮一個MongoDB的文檔:MongoDB中
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
有什麼辦法,來從服務器端tags
數組的長度(不通過標籤之客戶端) ?
謝謝!
現在的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"}
}
}
]
)
目前,唯一的辦法就是使用db.eval
,但是這個locks database for other operations。
非常感謝。是的,我也想過把尺寸保持在一個單獨的領域,但希望有更好的方法。 –
我認爲使用$inc或者通過計劃中的工作來計算每次保存(作爲單獨字段)的標籤數量可能更有效。
你也可以用map/reduce(canonical example)做到這一點,但這似乎不是你想要的。
我不知道這是可以做到的正是你所問的,但可以查詢所有符合一定規模與$size,這些文件...
> db.collection.find({ tags : { $size: 3 }});
這會得到大家的與3個標籤文件...
謝謝你的$大小提示,賈斯汀。 –
如果用戶名爲亞歷克斯是獨一無二的,你可以使用下面的代碼:
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 }
謝謝。這個問題在聚合框架無法使用時被問到,但現在它非常合理。 –
xmm.dev的回答可以簡化爲:而不必中間體領域「合作UNT」,你可以在$組直接總結:
db.test.aggregate(
{$match: {username : "Alex"}},
{$unwind: "$tags"},
{$group: {_id: null, number: {$sum: 1 }}}
)
我做了周圍的小工作因爲我需要查詢數組大小並返回它是否大於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個尺寸,所以此解決方案可以工作。
我不認爲你可以使用$ 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」}}}}) –
有趣的是沒有人抱怨關於它之前,謝謝 – anvarik
當我有這樣的事情時,怎麼可能得到:{username:'Alex',tags:[[''C#','Java','C++']]} 我們怎麼得到現在標籤的長度/大小? – rkatkam