Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update in forEach on mongodb shell

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})         } )     } ) }); 
like image 938
Mr Jerry Avatar asked Mar 26 '14 09:03

Mr Jerry


People also ask

How do you update an array in MongoDB?

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.

How do you update all elements in an array in MongoDB?

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.


2 Answers

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

like image 190
Neil Lunn Avatar answered Sep 23 '22 23:09

Neil Lunn


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                 }             ]         }     ] } 
like image 36
Sikorski Avatar answered Sep 19 '22 23:09

Sikorski