从与数组元素中的字段匹配的文档中删除数组元素

Remove array element from document matching a field in array element

我有一个这样的文档:

{
    "_id" : ObjectId("5f60ffc5aefd067a9ff9345c"),
    "_class" : "com.kalsym.smart.sms.data.MSASMS",
    "number1" : NumberLong(923211105469),
    "numbers2" : [ 
        {
            "field1" : "20200915532E888",
            "number2" : NumberLong(923018565627),
            "field2" : "abcd",
            "datefield" : ISODate("2020-10-10T17:54:09.886Z")
        }, 
        {
            "field1" : "2020092570A6948",
            "number2" : NumberLong(923018565627),
            "field2" : "efgh",
            "datefield" : ISODate("2020-10-06T15:23:04.891Z")
        }, 
        {
            "field1" : "2020092570A6948",
            "number2" : NumberLong(923018565627),
            "field2" : "ijkl",
            "datefield" : ISODate("2020-10-03T15:23:04.891Z")
        }
    ],
    "optInCount" : 0
}

我想删除包含 datefield 值大于 2020-10-04

的数组索引

执行命令后文档必须更新如下:

{
    "_id" : ObjectId("5f60ffc5aefd067a9ff9345c"),
    "_class" : "com.kalsym.smart.sms.data.MSASMS",
    "number1" : NumberLong(923211105469),
    "numbers2" : [ 
        {
            "field1" : "2020092570A6948",
            "number2" : NumberLong(923018565627),
            "field2" : "ijkl",
            "datefield" : ISODate("2020-10-03T15:23:04.891Z")
        }
    ],
    "optInCount" : 0
} 

您可以使用updateMany()update(),以及$pull删除匹配的记录形式数组,

db.collection.updateMany({},
{
  $pull: {
    numbers2: { datefield: { $gt: ISODate("2020-10-04T00:00:00.000Z") } }
  }
})

Playground