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] }
            }
          }
        }
      }
    }
  }
])