users
考虑集合中的 MongoDB 文档:
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
有什么方法可以tags
从服务器端获取数组的长度(不将标签传递给客户端)?
谢谢!
users
考虑集合中的 MongoDB 文档:
{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }
有什么方法可以tags
从服务器端获取数组的长度(不将标签传递给客户端)?
谢谢!
如果用户名 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 }
现在 MongoDB(2.6 版本)支持 $size
聚合操作。
从文档中:
{ <field>: { $size: <array> } }
您可以使用以下任一方法完成您想要的:
db.users.aggregate(
[
{
$group: {
_id: "$username",
tags_count: {$first: {$size: "$tags" }}
}
}
]
)
或者
db.users.aggregate(
[
{
$project: {
tags_count: {$size: "$tags"}
}
}
]
)
xmm.dev 的答案可以简化:您可以直接在 $group 中求和,而不是使用中间字段“count”:
db.test.aggregate(
{$match: {username : "Alex"}},
{$unwind: "$tags"},
{$group: {_id: null, number: {$sum: 1 }}}
)
目前,唯一的方法似乎是使用db.eval
,但这会锁定数据库以进行其他操作。
我做了一个小工作,因为我需要查询数组大小并在它大于 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 个尺寸,所以这个解决方案有效。