Can mongo upsert array data?

mongodb, node.js

Solution

I'm not aware of an option that would upsert into an embedded array as at MongoDB 2.2, so you will likely have to handle this in your application code.

Given that you want to treat the embedded array as sort of a virtual collection, you may want to consider modelling the array as a separate collection instead.

You can't do an upsert based on a field value within an embedded array, but you could use `$addToSet` to insert an embedded document if it doesn't exist already:

db.soup.update({
    "tester":"tom"
}, {
    $addToSet: {
        'array': {
            "id": "3",
            "letter": "d"
        }
    }
})

That doesn't fit your exact use case of matching by `id` of the array element, but may be useful if you know the expected current value.

Problem

I have a mongo document like this. ``` { "_id" : ObjectId("50b429ba0e27b508d854483e"), "array" : [ { "id" : "1", "letter" : "a" }, { "id" : "2", "letter" : "b" } ], "tester" : "tom" } ``` I want to be able to insert and update the `array` with a single mongo command and not use a conditional within a `find()` then run `insert()` and `update()` depending on the presence of the object. The `id` is the item I want to be the selector. So if I update the array with this: ``` { "id" : "2", "letter" : "c" } ``` I have to use a `$set` statement ``` db.soup.update({ "tester":"tom", 'array.id': '2' }, { $set: { 'array.$.letter': 'c' } }) ``` And if I want to insert a new object into the array ``` { "id" : "3", "letter" : "d" } ``` I have to use a `$push` statement ``` db.soup.update({ "tester":"tom" }, { $push: { 'array': { "id": "3", "letter": "d" } } }) ``` I need a sort of upsert for an array item. Do I have to do this programmatically or can I do this with a single mongo call?

Original source

Related problems