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 ofColor
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} } ) );