I want to copy over the color from user collection to the Car collection. I\'m using a foreign key which is userID.
> db.test1.User.find()
{ \"_id\" : Obj
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} }
)
);
There are several issues with your test set up:
color
instead of Color
when copying)ObjectId('515f7db83f71d6bcb1c41a48')
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")
}