将外键作为混合类型将一个字段从一个集合复制到mongodb中的另一个字段

时间:2018-11-12 11:16:02

标签: database mongodb mongodb-query

尽管我在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的用户文档不会更新。

1 个答案:

答案 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
            }
        )
    })

})

如果您有任何疑问,请随时提问