考虑users
集合中的MongoDB文档:
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
有没有办法从服务器端获取tags
数组的长度(不将标记传递给客户端)?
谢谢!
答案 0 :(得分:29)
如果用户名Alex是唯一的,您可以使用下一个代码:
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 :(得分:16)
我认为使用$inc计算每次保存(作为单独的字段)的标签数量可能更有效,或者通过计划中的作业来计算。
您也可以使用map / reduce(canonical example)执行此操作,但这似乎不是您想要的。
我不确定是否可以完全按照您的要求进行操作,但您可以使用$size查询与特定尺寸匹配的所有文档......
> db.collection.find({ tags : { $size: 3 }});
那将为您提供包含3个标签的所有文件......
答案 2 :(得分:16)
现在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"}
}
}
]
)
答案 3 :(得分:10)
xmm.dev的答案可以简化:不是让interm字段'count',而是直接在$ group中汇总:
db.test.aggregate(
{$match: {username : "Alex"}},
{$unwind: "$tags"},
{$group: {_id: null, number: {$sum: 1 }}}
)
答案 4 :(得分:9)
目前,唯一的方法是使用db.eval
,但locks database for other operations。
答案 5 :(得分: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个大小,所以这个解决方案有效。