Create array if not exists or append item to existing

Viewed 132

I need to add items to a specific subobject in my collection. Is is possible to do this using just the update method considering that the array may not exist in some objects?

Here's a sample structure:

[
  {
    "key": 1,
    "someValue": "abc",
    "installments": [
      {
        "number": 1,
        "payments": [
          {
            "paymentNumber": 1,
            "value": 29
          },
          {
            "paymentNumber": 2,
            "value": 22
          }
        ]
      }
    ]
  },
  {
    "key": 2,
    "someValue": "xyz",
    "installments": [
      {
        "number": 1,
        "payments": [
          {
            "paymentNumber": 3,
            "value": 10
          },
          {
            "paymentNumber": 4,
            "value": 1
          },
          {
            "paymentNumber": 5,
            "value": 5
          }
        ]
      }
    ]
  }
]

And here's the syntax I'm using:

db.collection.update({
  "installments.payments.paymentNumber": 4
},
{
  "$push": {
    "installments.payments": [
      {
        "receipts": [
          {
            "receiptNumber": 1
          }
        ]
      }
    ]
  }
})

This is causing this error:

fail to run update: multiple write errors: [{write errors: [{Cannot create field 'payments' in element {installments: [ { number: 1.0, payments: [ { paymentNumber: 3.0, value: 10.0 }, { paymentNumber: 4.0, value: 1.0 }, { paymentNumber: 5.0, value: 5.0 } ] } ]}}]}, {<nil>}]

Is it possible?

Here's the Mongo Playground link

And here's the expected result:

[
  {
    "key": 1,
    "someValue": "abc",
    "installments": [
      {
        "number": 1,
        "payments": [
          {
            "paymentNumber": 1,
            "value": 29
          },
          {
            "paymentNumber": 2,
            "value": 22
          }
        ]
      }
    ]
  },
  {
    "key": 2,
    "someValue": "xyz",
    "installments": [
      {
        "number": 1,
        "payments": [
          {
            "paymentNumber": 3,
            "value": 10
          },
          {
            "paymentNumber": 4,
            "value": 1,
            "receipts": [{
              "receiptNumber": 1
            }]
          },
          {
            "paymentNumber": 5,
            "value": 5
          }
        ]
      }
    ]
  }
]
1 Answers

To update nested arrays, the filtered positional operator $[identifier] identifies the array elements that match the arrayFilters conditions for an update operation.

Try the following query to $push in nested array:

db.collection.update({
  "installments.payments.paymentNumber": 4,
  
},
{
  "$push": {
    "installments.$.payments.$[payments].receipts": {
      "receiptNumber": 1
    }
  }
},
{
  "arrayFilters": [
    {
      "payments.paymentNumber": 4
    }
  ],
  multi: true
})

MongoDB Playground

Related