【问题标题】:MongoDB copy a field to another collection with a foreign keyMongoDB 使用外键将字段复制到另一个集合
【发布时间】:2013-03-28 14:28:45
【问题描述】:

我想将颜色从用户集合复制到汽车集合。我使用的外键是 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" }

感谢您的帮助!

【问题讨论】:

  • 您能说出真正的问题吗,是您无法更新还是您的 userId 不匹配?

标签: mongodb copy foreign-keys database


【解决方案1】:

您的测试设置存在几个问题:

  • 字段名称大小写不匹配(您在复制时引用 color 而不是 Color)
  • 目标集合中只有一个示例外键匹配:ObjectId('515f7db83f71d6bcb1c41a48')
  • 您的更新只会影响“外键”的第一个匹配文档。这对于 1:1 的关系很好,但不是 1:many

考虑到上述情况的更正示例(除了不匹配的键):

db.test1.User.find().forEach( 
    function(x) {
        db.test2.Car.update(
            // query 
            { userID: x._id },

            // update 
            { $set: { color: x.Color} },

            // options:
            { "multi" : true } // Update all matching documents
        );
    }
);

这导致为示例文档中实际匹配的唯一外键设置{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")
}

【讨论】:

  • 我也有类似的情况。但是我的一些汽车文件有 _id 作为 String 和一些有 _id 作为 ObjectId 类型。上述解决方案不适用于 ObjectId。请帮忙。
  • @truekiller 请发布一个新问题,其中包含示例文档和问题的详细信息(您尝试过的内容、预期的结果以及当前无法解决的问题的说明)。跨度>
  • 我发布了一个新问题。 stackoverflow.com/questions/53261010/…请看一下。
【解决方案2】:

这是我的两分钱:你可以放弃“function(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} } 
    ) 
);

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 2019-04-15
    • 2021-06-14
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2014-09-04
    • 2021-09-07
    • 2021-03-13
    相关资源
    最近更新 更多