mongodbrobo3tstudio3t

Remove array element from document matching a field in array element


I have a document looking like this:

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

I want to delete array indices containing datefield value greater than 2020-10-04

After executing the command document must be updated like this:

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

Solution

  • You can use updateMany() or update(), and $pull to remove matching record form array,

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

    Playground