如何使用 mongoose 通过匹配对象数组中的值来聚合 mongodb 数据?

How to aggregate mongodb data by matching a value in object array using mongoose?

提问人:Sindhu1990 提问时间:8/4/2023 最后编辑:Sindhu1990 更新时间:8/4/2023 访问量:15

问:

嗨,我在mongodb中有以下数据

{
  "_id": {
    "$oid": "64ca10afd4b19833b87298d4"
  },
  "orderId": "597628170576",
   "items": [
    {
      "_id": {
        "$oid": "64ca10b2d4b19833b87298d7"
      },
      "item_id": "ITEM_004",
      "title": "Sampoo",
      "subtotal": 28,
      "total": 30.32,
      "tax": 2.32,
      "discount": 20
    }
  ]
},
{
  "_id": {
    "$oid": "64ca10afd4b19833b87298d4"
  },
  "orderId": "597628170576",
  "items": [
    {
      "_id": {
        "$oid": "64ca10b2d4b19833b87298d7"
      },
      "item_id": "ITEM_004",
      "title": "Sampoo",
      "quantity": 4,
      "tax": 2.32,
      "discount": 20
    }
  ]

}

我有一个要求,我必须匹配 items.tax >0 并显示

以下是我尝试的聚合

model.aggregate([
          {
            $match: {
              item: {
                $elemMatch: {
                  tax: { $gt: 0 }
                }
              }
            }
          },
          { $group: { _id: null, count: { $sum: 1 } } }
        ])

但这似乎给了我空值,请告诉我如何进一步进行

节点 .js mongoDB 对象 猫鼬 聚合

评论


答:

0赞 Jota0222 8/4/2023 #1

在您编辑之后,我注意到这些项目确实是嵌套的,因此,问题可能是该属性是“items”(复数形式),而您正在查看一个不存在的称为“item”的属性。

所以这应该有效:

model.aggregate([
  {
     $match: {
       items: {
          $elementMatch: {
            tax: { $gt: 0 }
          }
       }
     }
  },
  { $group: { _id: null, count: { $sum: 1 } } }
])

或更短:

model.aggregate([
  {
     $match: {
       "items.tax": { $gt: 0 }
     }
  },
  { $group: { _id: null, count: { $sum: 1 } } }
])

更多信息请见:https://www.mongodb.com/docs/manual/reference/operator/query/elemMatch/#examples

评论

0赞 Sindhu1990 8/4/2023
我已经编辑了我的数据,请让我知道这是否有效