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

Posted

技术标签:

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

虽然我在*** 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 是不可变的。 【参考方案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 的查询请检查更新的答案

以上是关于在mongodb中将一个字段从一个集合复制到另一个集合,外键为混合类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firestore -Flutter 中将所有文档从一个集合复制到另一个集合?

在Django中将模型对象从模型复制到另一个模型

我如何将对象属性复制到另一个对象?

如何使用可重复对象中的嵌套必填字段将数据从一个表复制到另一个表

在Java中将字符串集合复制到另一个字符串的时间复杂度

在Java中将文件从一个目录复制到另一个目录