Reputation: 899
I want to update all the collection field profile.email with emails.[0].address just something like this in SQL:
update dbo.users
set profile.email=emials.[0].address
I know this stupid code won't work on SQL either. Just put it to make it sensible for what I need.
it is something like this,but is not working:
db.getCollection('users').update(
{_id: "QYoHQkTuTXnEC6Pws"},
{$set:
{'profile.email': db.getCollection('users').aggregate({$match: {_id:'QYoHQkTuTXnEC6Pws'}},
{$project: {_id:0,email: {$arrayElemAt:
['$emails.address',0]}}})
}
}
)
the result is not true :
"email" : {
"_batch" : [
{
"email" : "[email protected]"
}
],
"_useReadCommands" : true,
"_cursorid" : NumberLong(0),
"_batchSize" : undefined,
"_ns" : "meteor.users",
"_db" : {
"_mongo" : {
"slaveOk" : true,
"host" : "localhost:3001",
"defaultDB" : "",
"_readMode" : "commands",
"_writeMode" : "commands"
},
"_name" : "meteor"
},
"_collName" : "users",
"_cursorHandle" : {}
}
Upvotes: 1
Views: 540
Reputation: 15244
You have to iterate over each document and update to achieve expected result.
db.users.find({}).forEach(function (user) {
db.users.update({_id: user._id}, {$set: {'profile.email': user.emails[0].address}});
});
Upvotes: 2
Reputation: 61
db.users.update({_id: "doc id"},
{$set: {'profile.email': db.users.find({_id: "doc id"}).emails[0].address}
})
Your task has 2 steps: 1. get the email address, which is performed by "db.users.find" 2. update the document, which is performed by "db.users.update"
Upvotes: -1