MongoDB copy a field to another collection with a foreign key MongoDB copy a field to another collection with a foreign key mongodb mongodb

MongoDB copy a field to another collection with a foreign key


There are several issues with your test set up:

  • Case of field names does not match (you are referencing color instead of Color when copying)
  • Only one of the example foreign keys matches in the target collection: ObjectId('515f7db83f71d6bcb1c41a48')
  • Your update will only affect the first matching document for the "foreign key". This would be fine for a 1:1 relationship, but not a 1:many

A corrected example taking the above into account (aside from the non-matching keys):

db.test1.User.find().forEach(     function(x) {        db.test2.Car.update(            // query             { userID: x._id },            // update             { $set: { color: x.Color} },            // options:            { "multi" : true } // Update all matching documents        );    });

Which results in setting {color:blue} for the only foreign key that actually matches in the sample documents:

db.test2.Car.find(){    "_id" : ObjectId("515f84883f71d6bcb1c41a55"),    "speed" : 202,    "userID" : ObjectId("515f7db83f71d6bcb1c41a49")}{    "_id" : ObjectId("515f84883f71d6bcb1c41a56"),    "speed" : 193,    "userID" : ObjectId("515f7db83f71d6bcb1c41a4a")}{    "_id" : ObjectId("515f84883f71d6bcb1c41a54"),    "color" : "blue",    "speed" : 291,    "userID" : ObjectId("515f7db83f71d6bcb1c41a48")}


Here are my two cents: you can drop "function(x)". I prefer the following syntax:

db.source_collection_name.find().forEach(  doc=>      db.target_collection_name.update(        {"_id": doc._id},        {$set: {"field_to_update": doc.field}}      ))

In your case, something like this should work:

db.test1.User.find().forEach(  doc=>     db.test2.Car.update(       { "userID": doc._id },       { $set: { "color": doc.Color} }     ) );