Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB使用外键将字段复制到另一个集合_Mongodb_Copy_Foreign Keys_Database - Fatal编程技术网

MongoDB使用外键将字段复制到另一个集合

MongoDB使用外键将字段复制到另一个集合,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

我想将颜色从用户收藏复制到汽车收藏。我使用的外键是userID

> 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} } 
    ) 
);