Mongodb 对符合条件的数组元素进行计数
这是我正在研究的一个集合的简化版本:Mongodb 对符合条件的数组元素进行计数,mongodb,Mongodb,这是我正在研究的一个集合的简化版本: >使用tdb >db.tcol.insertMany([{“pid”:1,“类型”:“简单”,“变体”:[]},{“pid”:2,“类型”:“简单”,“变体”:[]},{“pid”:3,“类型”:“变量”,“变体”:[{“vid”:1,“instock”:false},{“vid”:2,“instock”:true},{“vid”:3,“instock”:true}]},{“pid”:4,“类型”:“变量”,“变体”:[{“vid 1”,“instock”:
>使用tdb
>db.tcol.insertMany([{“pid”:1,“类型”:“简单”,“变体”:[]},{“pid”:2,“类型”:“简单”,“变体”:[]},{“pid”:3,“类型”:“变量”,“变体”:[{“vid”:1,“instock”:false},{“vid”:2,“instock”:true},{“vid”:3,“instock”:true}]},{“pid”:4,“类型”:“变量”,“变体”:[{“vid 1”,“instock”:false},{“vid 2”,“instock”:false}]},{“pid”:5,“type”:“variable”,“variations”:[{“vid”:1,“instock”:true}]})
>db.tcol.find({},{u id:0}).pretty()
{“pid”:1,“类型”:“简单”,“变体”:[]}
{“pid”:2,“类型”:“简单”,“变体”:[]}
{
“pid”:3,
“类型”:“变量”,
“变化”:[
{
“视频”:1,
“instock”:错误
},
{
“视频”:2,
“instock”:正确
},
{
“视频”:3,
“instock”:正确
}
]
}
{
“pid”:4,
“类型”:“变量”,
“变化”:[
{
“视频”:1,
“instock”:错误
},
{
“视频”:2,
“instock”:错误
}
]
}
{
“pid”:5,
“类型”:“变量”,
“变化”:[
{
“视频”:1,
“instock”:正确
}
]
}
我试图计算变体数组中库存的元素数(“instock”:true
),在本例中为3,{“pid”:2,“vid”:2}
,{“pid”:2,“vid”:3}
,和{“pid”:5,“vid”:1}
另外,只有带有“type”:“variable”
的记录才有变化,因此我也必须对其进行过滤
为了计数,我发现我可以使用并只返回那些在变体数组中至少有一个文档带有instock:true
的记录:
>db.tcol.aggregate([{“$match”:{“type”:“variable”,“variations.instock”:true},{“$project”:{“\u id”:0}}]))
{“pid”:3,“type”:“variable”,“variations”:[{“vid”:1,“instock”:false},{“vid”:2,“instock”:true},{“vid”:3,“instock”:true}]}
{“pid”:5,“type”:“variable”,“variations”:[{“vid”:1,“instock”:true}]}
现在如果像这样使用,我将得到2,这只是在变体数组中至少有一个instock为true的文档的记录
>db.tcol.aggregate([{“$match”:{“type”:“variable”,“variations.instock”:true},{“$group”:{“\u id”:null,“count”:{“$sum”:1}}}])
{u id:null,“count:2}
但是我试图计算这个数组中所有库存的元素,并返回tcol
的所有记录的总和。我该怎么做?
$match
您的条件
$filter
迭代循环pf变体
并通过instock进行过滤
$size
获取上述筛选结果中的元素总数
$group
按空值和上述大小的元素总数求和
你能显示你的预期结果格式吗?@turivishal预期结果只是数字3,或者{“\u id”:null,“count”:3}
。这对你有帮助吗?
db.tcol.aggregate([
{
$match: {
"type": "variable",
"variations.instock": true
}
},
{
$group: {
_id: null,
total: {
$sum: {
$size: {
$filter: {
input: "$variations",
cond: { $eq: ["$$this.instock", true] }
}
}
}
}
}
}
])