MongoDB使用外键将字段复制到另一个集合
我想将颜色从用户收藏复制到汽车收藏。我使用的外键是userIDMongoDB使用外键将字段复制到另一个集合,mongodb,copy,foreign-keys,database,Mongodb,Copy,Foreign Keys,Database,我想将颜色从用户收藏复制到汽车收藏。我使用的外键是userID > db.test1.User.find() { "_id" : ObjectId("515f7db83f71d6bcb1c41a48"), "age" : 33, "Color" : "blue" } { "_id" : ObjectId("515f7dc03f71d6bcb1c41a49"), "age" : 52, "Color" : "red" } { "_id" : ObjectId("515f7dc43f71d6b
> db.test1.User.find()
{ "_id" : ObjectId("515f7db83f71d6bcb1c41a48"), "age" : 33, "Color" : "blue" }
{ "_id" : ObjectId("515f7dc03f71d6bcb1c41a49"), "age" : 52, "Color" : "red" }
{ "_id" : ObjectId("515f7dc43f71d6bcb1c41a4a"), "age" : 43, "Color" : "yellow" }
> db.test2.Car.find()
{ "_id" : ObjectId("515f84883f71d6bcb1c41a54"), "speed" : 291, "userID" : ObjectId("515f7db83f71d6bcb1c41a48") }
{ "_id" : ObjectId("515f84883f71d6bcb1c41a55"), "speed" : 202, "userID" : ObjectId("515f7db83f71d6bcb1c41a49") }
{ "_id" : ObjectId("515f84883f71d6bcb1c41a56"), "speed" : 193, "userID" : ObjectId("515f7db83f71d6bcb1c41a4a") }
这是我的问题
db.test1.User.find().forEach(
function(x)
{
db.test2.Car.update( { userID: x._id }, { $set: { color: x.color} } )
} );
我想要这个结果:
> db.test2.Car.find()
{ "_id" : ObjectId("515f84883f71d6bcb1c41a54"), "speed" : 291, "userID" : ObjectId("515f7db83f71d6bcb1c41a48"), "color" : "blue" }
{ "_id" : ObjectId("515f84883f71d6bcb1c41a55"), "speed" : 202, "userID" : ObjectId("515f7db83f71d6bcb1c41a49"), "color" : "red" }
{ "_id" : ObjectId("515f84883f71d6bcb1c41a56"), "speed" : 193, "userID" : ObjectId("515f7db83f71d6bcb1c41a4a"), "color" : "yellow" }
谢谢你的帮助 您的测试设置有几个问题:
- 字段名的大小写不匹配(复制时您引用的是
,而不是color
)color
- 目标集合中只有一个示例外键匹配:
ObjectId('515f7db83f71d6bcb1c41a48')
- 您的更新只会影响“外键”的第一个匹配文档。这对1:1的关系是好的,但不是1:1的关系
{color:blue}
:
db.test2.Car.find()
{
"_id" : ObjectId("515f84883f71d6bcb1c41a55"),
"speed" : 202,
"userID" : ObjectId("515f7db83f71d6bcb1c41a49")
}
{
"_id" : ObjectId("515f84883f71d6bcb1c41a56"),
"speed" : 193,
"userID" : ObjectId("515f7db83f71d6bcb1c41a4a")
}
{
"_id" : ObjectId("515f84883f71d6bcb1c41a54"),
"color" : "blue",
"speed" : 291,
"userID" : ObjectId("515f7db83f71d6bcb1c41a48")
}
这是我的两分钱:你可以删除“函数(x)”。我更喜欢以下语法:
db.source_collection_name.find().forEach(
doc=>
db.target_collection_name.update(
{"_id": doc._id},
{$set: {"field_to_update": doc.field}}
)
)
在您的情况下,类似这样的方法应该会起作用:
db.test1.User.find().forEach(
doc=>
db.test2.Car.update(
{ "userID": doc._id },
{ $set: { "color": doc.Color} }
)
);
你能告诉我真正的问题是什么吗?是你不能更新还是你的用户名不匹配?我有类似的情况。但是我的一些car文档将_id作为字符串,而另一些文档将_id作为ObjectId类型。上述解决方案不适用于ObjectId。请提供帮助。@truekiller请发布一个新问题,包括示例文档和问题的详细信息(您尝试了什么,您期望的结果是什么,以及对当前不起作用的内容的描述)。我发布了一个新问题。请看一看。
db.test1.User.find().forEach(
doc=>
db.test2.Car.update(
{ "userID": doc._id },
{ $set: { "color": doc.Color} }
)
);