MongoDB使用聚合管道查找和更新

安南·维维克(Ananth Vivek)

我在MongoDB中有这样的数据

    {"_id":{"$oid":"5ec4ed0b94996124187b95ce"},
           "cid":"245345323",
     "dtl":[
          {"_id":{"$oid":"5ed5ab655df7930ec424be1e"},
              "sid":"test",
              "amt":{"$numberInt":"48"},
              "Name":"test"},
          {"_id":{"$oid":"5ed5ac9f79a75423d4bc0270"},
             "sid":"s",
             "amt":{"$numberInt":"14"},
             "Name":"sfds"},
          {"_id":{"$oid":"5ed5ace7d204ab144863ed7a"},
             "sid":"wesad",
             "amt":{"$numberInt":"6"},
             "Name":"2sdad"
          },
        "updated":{"$date":{"$numberLong":"1589964043787"}},
        "__v":{"$numberInt":"6"},
       "TotalAmt":{"$numberInt":"68"}}

仅当数组中的amt字段的值大于10时,才需要更新TotalAmt字段。我使用了以下2个选项

PM.findOneAndUpdate(
      {
        _id: MongoId,
      },
      [
        {
          $set: {
            //TotalAmt: { $sum: '$dtl.amt' },
            /*TotalAmt: {
              $cond: {
                if: { $gte: ['$dtl.amt', 10] },
                then: { $sum: '$dtl.amt' },
                else: 0,
              },
            },*/
          },
        },
      ],
      { new: true }
    )

它在没有amt> 10条件的情况下正常工作(注释了第一个选项)。但是,如果我添加条件,则无法正常工作。任何帮助,将不胜感激。谢谢

瓦利洪

您需要使用$ filter运算符:

PM.findOneAndUpdate(
  {
    _id: MongoId,
  },
  [
    {
      $set: {
        TotalAmt: { 
          $sum: {
            $filter: {
              input: '$dtl.amt',
              cond: { $gte: ['$$this', 10] }
            }
          }
        }
      }
    }
  ]
  { new: true }
)

-输出-

{
    "_id" : ObjectId("5ec4ed0b94996124187b95ce"),
    "cid" : "245345323",
    "dtl" : [ 
        {
            "_id" : ObjectId("5ed5ab655df7930ec424be1e"),
            "sid" : "test",
            "amt" : 48,
            "Name" : "test"
        }, 
        {
            "_id" : ObjectId("5ed5ac9f79a75423d4bc0270"),
            "sid" : "s",
            "amt" : 14,
            "Name" : "sfds"
        }, 
        {
            "_id" : ObjectId("5ed5ace7d204ab144863ed7a"),
            "sid" : "wesad",
            "amt" : 6,
            "Name" : "2sdad"
        }
    ],
    "updated" : ISODate("2020-05-20T08:40:43.787Z"),
    "__v" : 6,
    "TotalAmt" : 62
}

编辑:如果要按其他字段过滤,我们需要添加额外的$map运算符。

PM.findOneAndUpdate(
  {
    _id: MongoId,
  },
  [
    {
      $set: {
        TotalAmt: { 
          $sum: {
            $map:{
                input: {
                  $filter: {
                    input: '$dtl',
                    cond: { $eq: ['$$this.Name', 'test'] }
                  }
                },
                in:"$$this.amt"
            }
          }
        }
      }
    }
  ],
  { new: true }
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Mongodb中使用聚合,查找和管道进行查询

来自分类Dev

MongoDB聚合双重查找和管道

来自分类Dev

在尝试使用聚合查找和更新时遇到错误“管道元素3不是对象错误”

来自分类Dev

使用MongoDB聚合管道展开和汇总子子文档

来自分类Dev

使用 ObjectId 的 mongodb 聚合查找

来自分类Dev

如何使用 mongodb 和 node 中的聚合更新值

来自分类Dev

使用MongoDB聚合管道计数文档

来自分类Dev

使用MongoDB聚合管道计数文档

来自分类Dev

在更新操作上使用聚合管道时,MongoDB“'$'本身不是有效的FieldPath”

来自分类Dev

猫鼬聚合管道查找和嵌套对象

来自分类Dev

Mongodb聚合管道很慢

来自分类Dev

Mongodb聚合管道项目

来自分类Dev

MongoDB聚合管道问题

来自分类Dev

MongoDB聚合管道python

来自分类Dev

Mongodb从计数功能和聚合管道提供不同的计数结果

来自分类Dev

使用关联集合字段进行查找和排序的MongoDB聚合正在减慢查询速度

来自分类Dev

如何在mongodb中查找文档并使用聚合查找属性?

来自分类Dev

如何在mongodb聚合管道内使用Javascript对象?

来自分类Dev

如何在mongodb聚合管道内使用Javascript对象?

来自分类Dev

如何对MongoDB聚合管道使用多个运算符?

来自分类Dev

在Mongodb中使用聚合管道重新格式化集合

来自分类Dev

带循环的MongoDB聚合管道

来自分类Dev

MongoDB聚合管道的新日期

来自分类Dev

mongodb 管道聚合管道替换值

来自分类Dev

MongoDB在3个集合之间进行聚合和查找

来自分类Dev

使用聚合和管道无法获得正确的结果

来自分类Dev

在mongodb中的聚合管道中展开操作后,查找阶段不起作用

来自分类Dev

优化使用$ min和$ max的mongoDB聚合

来自分类Dev

结果未使用聚合和MongoDB排序

Related 相关文章

热门标签

归档