mongodb 在对象数组中使用mongo进行多重更新

esyap4oy  于 2023-01-20  发布在  Go
关注(0)|答案(1)|浏览(143)

我是mongodb的新手,我有一个包含对象数组的人员集合,我需要用今天的日期更新不到2个月前的所有“a.b.c.日期”

{
    "_id" : "xxxxxxxxxxxxxxx",
    "a" : {
        "b" : {
            "c" : [ 
                {
                    "date" : ISODate("2021-01-01T09:02:53.217Z"),
                    "value" : "aaa"
                }, 
                {
                    "date" : ISODate("2022-01-01T09:03:38.948Z"),
                    "value" : "bbb"
                }, 
                {
                    "date" : ISODate("2023-01-01T09:15:03.376Z"),
                    "value" : "ccc"
                }
            ]
        }
    },

}
{
    "_id" : "yyyyyyyyyyyyyyy",
    "a" : {
        "b" : {
            "c" : [ 
                {
                    "date" : ISODate("2021-01-01T09:02:53.217Z"),
                    "value" : "aaa"
                }, 
                {
                    "date" : ISODate("2023-01-01T09:03:38.948Z"),
                    "value" : "bbb"
                }, 
                {
                    "date" : ISODate("2023-01-01T09:15:03.376Z"),
                    "value" : "ccc"
                }
            ]
        }
    },

}

我尝试了此查询,但它只修改每个人的1条记录

db.getCollection('people').update({"a.b.c.date": {$lt: ISODate("2022-11-19")}}, 
{$set: {"a.b.c.$.date": ISODate('2023-01-19T01:07:42.313+00:00')}}, {multi: true})

我希望所有日期都在2023年

zzlelutf

zzlelutf1#

From the update positional $ operator
位置操作符$充当与查询文档匹配的第一个元素的占位符
若要更新数组中匹配的所有项,应使用位置筛选运算符$[<identifier>]

db.getCollection('people').update({
  "a.b.c.date": {
    $lt: ISODate("2022-11-19")
  }
},
{
  $set: {
    "a.b.c.$[c].date": ISODate("2023-01-19T01:07:42.313+00:00")
  }
},
{
  arrayFilters: [
    {
      "c.date": {
        $lt: ISODate("2022-11-19")
      }
    }
  ],
  multi: true
})

Demo @ Mongo Playground

相关问题