【问题标题】:Remove array element from document matching a field in array element从与数组元素中的字段匹配的文档中删除数组元素
【发布时间】:2021-01-28 13:42:20
【问题描述】:

我有一个如下所示的文档:

{
    "_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
} 

【问题讨论】:

  • 你想用什么语言来实现这个?请以该语言显示您的工作代码。
  • 我想使用 Robo 3T 客户端在 shell 中执行这个查询
  • 您应该在您的问题中添加robo3t 标签。
  • 根据您的预期结果,"datefield" : ISODate("2020-09-03T15:23:04.891Z") 这个日期比2020-10-04 大多少?你也试过什么?
  • 抱歉我的错误我已经用正确的日期更新了问题

标签: mongodb robo3t studio3t


【解决方案1】:

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

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

Playground

【讨论】:

    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2014-05-19
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多