尽管我在stackOverFlow MongoDB copy a field to another collection with a foreign key
上发现了类似的问题我想将name
集合中的字段userdetails
复制到user
集合中,其中userDetails中的userId等于user中的_id。
用户集合
{
"_id" : ObjectId("5b97743bbff66e0be66283cc"),
"username" : "mmi_superadmin",
"accId" : "acc1"
}
{
"_id" : "c21d580ea3ca5c7a1664bd5feb57f0c8",
"username" : "client",
"accId" : "acc1"
}
userDetail 集合
{
"_id" : ObjectId("5b97743bbff66e0be66283cd"),
"userId" : "5b97743bbff66e0be66283cc",
"name" : "mmi_superadmin"
}
{
"_id" : "5bab8a60ef86bf90f1795c44",
"userId" : "c21d580ea3ca5c7a1664bd5feb57f0c8",
"name" : "RAHUL KUMAR TIWARI"
}
这是我的查询:
db.userDetails.find().forEach(
function(x) {
db.user.update( {_id :x.userId}, {$set: {name:x.name}});
}
);
此查询部分有效。它仅更新_id为字符串类型的user
文档。 _id为ObjectId的用户文档不会更新。
答案 0 :(得分:1)
请检查您的文档_id(因为在您的示例中某些_id是无效的文档_id,例如c21d580ea3ca5c7a1664bd5feb57f0c8
不是mongo _id),并使用以下查询:
let usersIds = [];
db.user.find({"_id": {$type: 7}}).forEach(doc => {
usersIds.push(doc._id + '')
db.userDetail.find({
userId: {
$in: usersIds
}
}).forEach(doc => {
db.user.update(
{
"_id": ObjectId(doc.userId)
},
{
$set: {
"name": doc.name
}
},
{
multi: false,
upsert: false
}
)
})
})
如果您有任何疑问,请随时提问