Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Push object into array if the array exists otherwise create the array with object in MongoDB

I have collection with a document like this:

{
    _id : "abcd",
    name : "Tom",
    myArray : [
        {
            field1 : "",
            field2 : ""
        }
    ]
},
{
    _id : "efgh",
    name : "Jerry"
}

I have a new object for myArray. I want to write a query to update only one document.

If the query matches the document with _id : "abcd", then push the new object in to myArray field:

{
    _id : "abcd",
    name : "Tom",
    myArray : [
        {
            field1 : "",
            field2 : ""
        },
        {
            // new object
        }
    ]
}

And if the query matches with _id : "efgh" create the field myArray with new object inside it:

{
    _id : "efgh",
    name : "Jerry"
    myArray : [
         {
              // new object
         }
    ]
}

How can I achieve this?

like image 243
iamhimadri Avatar asked Aug 02 '15 09:08

iamhimadri


People also ask

How do you push an object into an array in MongoDB query?

In MongoDB, the $push operator is used to appends a specified value to an array. If the mentioned field is absent in the document to update, the $push operator add it as a new field and includes mentioned value as its element. If the updating field is not an array type field the operation failed.

How do I pull an object from an array in MongoDB?

The $pull operator removes from an existing array all instances of a value or values that match a specified condition. The $pull operator has the form: { $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } } To specify a <field> in an embedded document or in an array, use dot notation.

How do you push values into an array of objects?

To push an object into an array, call the push() method, passing it the object as a parameter. For example, arr. push({name: 'Tom'}) pushes the object into the array. The push method adds one or more elements to the end of the array.


2 Answers

To explain all the possible cases here, the consider each document case:

If your document to alter looks like this:

{
    "_id": "efgh",
    "name": "Jerry"
}

Then an update statment like this:

db.collection.update(
    { "_id": "efgh" },
    { "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

Results in this:

{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": [
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}

So the array is created and the new item appended.

If your document already has an array like this:

{
    "_id": "abcd",
    "name": "Tom",
    "myArray": [
        {
            "field1": "",
            "field2": ""
        }
    ]
}

And you do basically the same statement:

db.collection.update(
    { "_id": "abcd" },
    { "$push": { "myArray": { "field1": "abc", "field2": "def" } } }
)

Then the new document content is appended to the existing array:

{
    "_id": "abcd",
    "name": "Tom",
    "myArray": [
        {
            "field1": "",
            "field2": ""
        },
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}

If however your original document has the named field but it is not an array, like this:

{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": 123
}

Then make sure it is not an array by testing in the query condtion and using $set instead:

db.collection.update(
    { "_id": "efgh", "myArray.0": { "$exists": false } },
    { "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] } }
)

That will safely overwrite the element that is not an array ( dot notation "myArray.0" means first array element, which is not true ) with a new array containing your content. The result is the same as the original:

{
    "_id": "efgh",
    "name": "Jerry",
    "myArray": [
        {
            "field1": "abc",
            "field2": "def"
        }
    ]
}
like image 182
Blakes Seven Avatar answered Nov 16 '22 02:11

Blakes Seven


$Push is what you need to achieve this. If the myArray is already existing then $push will insert the newObject to it( similar to the STACK data structure operation ). If the myArray doesn't exist, it will create the field "myArray" as key and will insert the newObject into it ( similar to $Set oprtaion )

Consider another below sample document :

{
_id : "abcd"
myArray:[
{
  field1:"mango",
  field2:"apple"
}
       ]
}

so now lets Insert the below object to it :

var newObject = {field1:"example1" , field2:"exmaple2"};

Query :

db.collection.update({_id:"abcd"},{"$push":{myArray: newObject }});

after execution of the above query, result is as below :

{
    _id : "abcd"
    myArray:[
    {
      field1:"mango",
      field2:"apple"
    },
    {
      field1:"example1" , 
      field2:"exmaple2"
    }
           ]
    }

Now let us consider another example where "myArray" key is NOT PRESENT in the document :

{
_id:"efg"
}

so lets insert the below object :

 var newObject2 = { field1 : "exp2" , field2 : "exp1" }

Query :

 db.collection.update({_id:"efg"},{"$push":{myArray: newObject2 }});

Result of the above UPDATE operation is below :

 {
   _id : "efg"
   myArray : [ 
   { 
    field1 : "exp2" , 
    field2 : "exp1"
  }
          ]
}
like image 28
Yathish Manjunath Avatar answered Nov 16 '22 03:11

Yathish Manjunath