【问题标题】:Copy a field from one collection to another in mongodb with foreign key as mixed type在mongodb中将一个字段从一个集合复制到另一个集合,外键为混合类型
【发布时间】:2019-04-15 02:32:39
【问题描述】:

虽然我在stackOverFlow MongoDB copy a field to another collection with a foreign key 找到了类似的问题

我想将字段 nameuserdetails 集合复制到 user 集合,其中 userDetails 中的 userId 等于用户中的 _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 的用户文档没有得到更新。

【问题讨论】:

  • Ye Olde JavaScript hack。 { _id: new ObjectId(x.userId.valueOf()) } 因为valueOf() 将返回“字符串”,无论是字符串还是ObjectId。当然,我们正在投射到ObjectId。强烈建议您实际上至少将所有_id 值标准化为ObjectId。这意味着删除不存在的文档,因为_id 是不可变的。

标签: database mongodb mongodb-query


【解决方案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
            }
        )
    })

})

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

【讨论】:

  • 用户表中的某些文档具有应用程序生成的 ID,我无法更改这些 ID。这就是所有复杂性所在。否则我在问题中提到的查询会起作用。
  • 在这种情况下,您可以运行两个不同的查询:首先您对字符串 _id 的查询第二个对 objectId 的查询请检查更新的答案
猜你喜欢
  • 2013-03-28
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2021-09-07
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多