在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 找到了类似的问题
我想将字段 name
从 userdetails
集合复制到 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 中将所有文档从一个集合复制到另一个集合?