Seeker
Seeker

Reputation: 1927

Updating a collection inside array of collections in MongoDB

I have a mongo collection workspaces in my MongoDB which consist of records that looks like as follows:

{
    "_id" : ObjectId("58bdc4a13504f5ed743ad025"),
    "name" : "My workspace",
    "user_id" : ObjectId("58b6cf53988a874af070fd3b"),
    "uploads" : [ 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.tif"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.tif"
        }
    ]
}

Now my objective is that i want to append something in one of record of array uploads with the match criteria of original field value. For example i want to append "pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif" to the {"original" : "DE-20__450_GG_5002_N23_994__0136.tif"} collection in following way:

{
    "_id" : ObjectId("58bdc4a13504f5ed743ad025"),
    "name" : "Objective",
    "user_id" : ObjectId("58b6cf53988a874af070fd3b"),
    "uploads" : [ 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.tif",
            "pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0136.png"
        }, 
        {
            "original" : "DE-20__450_GG_5002_N23_994__0134.tif"
        }
    ]
}

i tried using $elemMatch and then i added $addToSet in following way:

db.getCollection('workspaces').update({"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads": {$elemMatch: {"original": "DE-20__450_GG_5002_N23_994__0136.tif"}}},{$addToSet:{"uploads.$": {"pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}}})

but it gives me following error:

Cannot apply $addToSet to a non-array field. Field named '0' has a non-array type object in the document _id: ObjectId('58bdc4a13504f5ed743ad025')

I think i crafted the query wrong can anyone tell me what is wrong and how can i solve it?

Sorry for my bad english :) hope you understood what i said.

Upvotes: 2

Views: 836

Answers (1)

s7vr
s7vr

Reputation: 75984

Here is the correct syntax. You have to use $set with postional operator to reach the element.

db.getCollection('workspaces').update(
{"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads": {$elemMatch: {"original": "DE-20__450_GG_5002_N23_994__0136.tif"}}},
{$set:{"uploads.$.pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}})

More information here https://docs.mongodb.com/manual/reference/operator/update/positional/#update-documents-in-an-array

You can simplify your query criteria. You don't need to use $elemMatch operator for single query condition. You can use dot notation.

db.getCollection('workspaces').update(
{"_id": ObjectId("58bdc4a13504f5ed743ad025"),"uploads.original": "DE-20__450_GG_5002_N23_994__0136.tif"},
{$set:{"uploads.$.pseg" : "DE-20__450_GG_5002_N23_994__0136.pseg.tif"}})

More information here https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition

Upvotes: 2

Related Questions