Philip Lowe
Philip Lowe

Reputation: 73

MongoDB: Setting in a document with a nested document with nested arrays with nested documents

I want to $set a field in all documents within all arrays within a document within a document. Basically, I want to do this

{$set : {'documentname.*anyandallstrings*.*anyandallnum*.fieldname' : value}}

A sample of the document schema is here

{
"_id" : "abc123",
"documenttoset" : {
    "arrayname" : [ 
        {
            "fieldname" : "fieldvalue"
            //i want to add fields here,
        }, 
        {
            "fieldname2" : "fieldvalue2",
            "fieldname3" : "fieldvalue3"
            //here,
        }
    ],
    "arrayname2" : [ 
        {
            "fieldname4" : "fieldvalue4",
            "fieldname5" : "fieldvalue5",
            "fieldname6" : "fieldvalue6",
            //and here. 

        }
    ]
},
}

It should add the field in question to these nested documents, and must be scalable if there are more documents and more arrays.

I did not design the schema.

How is this done? I am not sure if it is even possible.

Upvotes: 2

Views: 104

Answers (1)

AaronLight
AaronLight

Reputation: 423

The only way to accomplish this is to iterate through the documents and update each field individually.

import pymongo

c = pymongo.mongo_client.MongoClient(host='localhost')

db = c.local

cursor = db.test.find()

for q in cursor:
    dic = q
    for f in dic:
        field = dic[f]
        if(f != '_id'):
            for a in field:
                array = field[a]

                for d in array:
                    d['newfield'] = 'value'

After you've done that you just have to find the document in question and update it.

db.test.update({'_id':'abc123'}, dic)

You'll have to use a driver (obviously). I like using python and pymongo, but there are tons of drivers out there.

If this is a db admin job I would recommend using pymongo within the python shell.

Hope it helps!!

Upvotes: 1

Related Questions