I have got a collection aTable with 2 records:
{ "title" : "record 1", "fields" : [ { "_id" : 1, "items" : [ 1 ] }, { "_id" : 2, "items" : [ 2,3,4 ] }, { "_id" : 3, "items" : [ 5 ] } ] }, { "title" : "record 2", "fields" : [ { "_id" : 4, "items" : [ 7,8,9,10 ] }, { "_id" : 5, "items" : [ ] }, { "_id" : 6, "items" : [ 11,12 ] } ] }
I want to update fields aTable.fields.items from
items : [ 11,12 ]
to
items : [ {item: 11, key: 0}, {item:12, key: 0} ]
I browse fields with forEach but I can't save it:
var t = db.aTable.find(); t.forEach(function( aRow ) { aRow.fields.forEach( function( aField ){ aField.items.forEach( function( item ){ var aNewItem = { item: parseInt(item), ref: 0 }; db.aTable.update(item, {$set:aNewItem}) } ) } ) });
You can use the updateOne() or updateMany() methods to add, update, or remove array elements based on the specified criteria. It is recommended to use the updateMany() method to update multiple arrays in a collection.
To update multiple elements, use []. The[] is an all positional operator indicating that the update operator should modify all elements in the specified array field.
To get what you want you will need a few things:
t.forEach(function( aRow ) { var newFields = []; aRow.fields.forEach( function( aField ){ var newItems = []; aField.items.forEach( function( item ){ var aNewItem = { item: parseInt(item), ref: 0 }; newItems.push( aNewItem ); } ); newFields.push({ _id: aField._id, items: newItems }); } ) aTable.update( { _id: aRow._id }, { "$set": { "fields": newFields } } ); });
So basically you need to "re-construct" your arrays before updating
You can make changes directly in the whole object and then save it. Try the following snippet
db.aTable.find().forEach(function (itemWrapper){ itemWrapper.fields.forEach(function(field){ var items = field.items; var newItems = []; items.forEach(function(item){ var t = {'item':item,'key':0} newItems.push(t); }) field.items = newItems; }) db.aTable.save(itemWrapper) })
What I am doing is iterating over all items and making a new array with {item : 1 , key:0}
and then setting it back to items array in field object.
This is the output after update :
{ "_id" : ObjectId("5332a192ece4ce8362c7a553"), "title" : "record 1", "fields" : [ { "_id" : 1, "items" : [ { "item" : 1, "key" : 0 } ] }, { "_id" : 2, "items" : [ { "item" : 2, "key" : 0 }, { "item" : 3, "key" : 0 }, { "item" : 4, "key" : 0 } ] }, { "_id" : 3, "items" : [ { "item" : 5, "key" : 0 } ] } ] } /* 1 */ { "_id" : ObjectId("5332a192ece4ce8362c7a554"), "title" : "record 2", "fields" : [ { "_id" : 4, "items" : [ { "item" : 7, "key" : 0 }, { "item" : 8, "key" : 0 }, { "item" : 9, "key" : 0 }, { "item" : 10, "key" : 0 } ] }, { "_id" : 5, "items" : [] }, { "_id" : 6, "items" : [ { "item" : 11, "key" : 0 }, { "item" : 12, "key" : 0 } ] } ] }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With