考虑users集合中的MongoDB文档:
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
Run Code Online (Sandbox Code Playgroud)
有没有办法,tags从服务器端获取数组的长度(不将标签传递给客户端)?
谢谢!
xmm*_*dev 30
如果用户名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 }
Run Code Online (Sandbox Code Playgroud)
anv*_*rik 17
现在MongoDB(2.6版本)支持 $size聚合操作.
从文档:
{ <field>: { $size: <array> } }
Run Code Online (Sandbox Code Playgroud)
通过使用以下内容,您可以完成以下任务:
db.users.aggregate(
[
{
$group: {
_id: "$username",
tags_count: {$first: {$size: "$tags" }}
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
要么
db.users.aggregate(
[
{
$project: {
tags_count: {$size: "$tags"}
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
Jus*_*ins 16
我认为使用$ inc计算每个保存(作为单独的字段)的标签数量可能更有效,或者通过计划中的作业来计算.
您也可以使用map/reduce(规范示例)执行此操作,但这似乎不是您想要的.
我不确定是否可以完全按照您的要求进行操作,但您可以使用$ size查询所有匹配特定大小的文档...
> db.collection.find({ tags : { $size: 3 }});
Run Code Online (Sandbox Code Playgroud)
那就是给你带来3个标签的所有文件......
Vol*_*kov 10
xmm.dev的答案可以简化:你可以直接在$ group中求和,而不是使用interm字段'count':
db.test.aggregate(
{$match: {username : "Alex"}},
{$unwind: "$tags"},
{$group: {_id: null, number: {$sum: 1 }}}
)
Run Code Online (Sandbox Code Playgroud)