我需要编写一个MongoDB聚合管道来对具有包含两种类型的值的数组的对象进行计数:
[
{ values: [ 1, 2, 3] },
{ values: [12, 1, 3] },
{ values: [1, 21, 3] },
{ values: [1, 2, 29] },
{ values: [22, 9, 2] }
]
{
has10s: 4,
has20s: 3
}
Mongo的$in (aggregation)似乎是完成任务的工具,但我无法使其正常工作。
db.mytable.aggregate([
{
$project: {
"has10s" : {
"$in": [ { "$gte" : [10, "$$CURRENT"]}, "$values"]}
},
"has20s" : {
"$in": [ { "$gte" : [20, "$$CURRENT"]}, "$values"]}
}
},
{ $group: { ... sum ... } }
])
$ in的输出似乎总是正确的。有人可以帮忙吗?
答案 0 :(得分:1)
您可以尝试以下操作:
db.collection.aggregate([{
$project: {
_id: 0,
has10: {
$size: {
$filter: {
input: "$values",
as: "item",
cond: { $gte: [ "$$item", 10 ] }
}
}
},
has20: {
$size: {
$filter: {
input: "$values",
as: "item",
cond: { $gte: [ "$$item", 20 ] }
}
}
}
}
},
{
$group: {
_id: 1,
has10: { $sum: "$has10" },
has20: { $sum: "$has20" }
}
}
])
使用$project
和$filter
来获取实际元素,然后通过$size
来获取数组长度。