【问题标题】:how to update one table with the _id from another table in Mongodb如何使用 Mongodb 中另一张表的 _id 更新一张表
【发布时间】:2020-01-19 23:21:52
【问题描述】:

我将数据从 MySQL 数据库导出为 JSON,然后将其导入 MongoDB。问题:

当我导入客户端时,MongoDB 创建了自己的 _id 字段(我知道这是内置功能,但 MySQL 使用了 clientID,自动递增整数)。

所以,当我导入我的约会集合时,clientID 被重命名为 oldClientID。我希望 clientID 字段是相应客户端的 ObjectID。

我的架构:

const apptSchema = new mongoose.Schema({
  ID: Number,
  clientID: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Client'
  },
  oldClientID: Number,
  ...other field data
});

const clientSchema = new mongoose.Schema({
 ID: Number,
 familyID: Number,
 first: String,
 last: String,
});

样本患者数据:

{ 
    "_id" : ObjectId("5d82240f7c8ddd03b62aee6a"), 
    "ID" : 18, 
    "familyID" : 6,
    "first" : "Jane", 
    "last" : "Doe"
}

约会数据示例

{ 
    "_id" : ObjectId("5d82c8b95627367d122087f9"), 
    "ID" : 1885, 
    "oldPatientID" : 18, 
    "scheduled" : ISODate("2015-08-05T11:20:00Z"), 
    "note" : ""
},
{ 
    "_id" : ObjectId("5d82c8b95627367d122088a8"), 
    "ID" : 2066, 
    "oldPatientID" : 18,  
    "scheduled" : ISODate("2015-09-17T16:00:00Z"), 
    "note" : ""
}

约会应该是什么样子:

{ 
    "_id" : ObjectId("5d82c8b95627367d122087f9"), 
    "ID" : 1885,
    "clientID": ObjectId("5d82240f7c8ddd03b62aee6a"),
    "oldPatientID" : 18, 
    "scheduled" : ISODate("2015-08-05T11:20:00Z"), 
    "note" : ""
},
{ 
    "_id" : ObjectId("5d82c8b95627367d122088a8"), 
    "ID" : 2066,
    "clientID" : ObjectId("5d82240f7c8ddd03b62aee6a"),
    "oldPatientID" : 18,  
    "scheduled" : ISODate("2015-09-17T16:00:00Z"), 
    "note" : ""
}

我愿意学习如何在 mongo shell 中实现这一点,或者在 express 中使用 mongoose(或者如果有另一种很酷的方式,比如在 Robo3T 中)。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    MongoDB 将始终使用_id 作为主键,此行为无法被覆盖,尽管您可以将_id 与您的自定义 id 中的值一起使用。虽然这可能会令人困惑,但最好在自定义 id 上使用索引,并且您不需要将 ObjectId 用于自定义索引字段,但可以使用您自己的自定义 id 架构,例如 UUID 或递增整数值等,尽管它必须由您或某些框架生成/递增,例如 JPA

    查看Indexes


    对于猫鼬,你可以这样做;

    new mongoose.Schema({
      customId: { type: Number, index: true }
      ...other field data
    });
    

    index: true

    【讨论】:

    • 哦!我不知道我能做到这一点。我最终使用了一个带有查找阶段的聚合查询,然后将表中的 _id 投影到 clientID 字段中。将其保存为新表,并以 mongo 方式连接。不过还是谢谢!我喜欢这个主意!
    • @mcadio 我明白了,但是您仍然可以在默认模式创建步骤中使用something like this 将自定义字段作为_id 传递,但通常会忽略_id,并且自定义字段与一个索引
    【解决方案2】:

    好的,这对我来说很有效,尽管我确信必须有更简单的方法:

    db.getCollection("appts").aggregate(
        [
            { 
                "$lookup" : {
                    "from" : "clients", 
                    "localField" : "clientID", 
                    "foreignField" : "ID", 
                    "as" : "CLIENT"
                }
            }, 
            { 
                "$lookup" : {
                    "from" : "appttypes", 
                    "localField" : "type", 
                    "foreignField" : "ID", 
                    "as" : "TYPE"
                }
            }, 
            { 
                "$lookup" : {
                    "from" : "apptstatuses", 
                    "localField" : "status", 
                    "foreignField" : "ID", 
                    "as" : "STATUS"
                }
            }, 
            { 
                "$project" : {
                    "_id" : "$_id", 
                    "clientID" : "$CLIENT._id", 
                    "scheduled" : "$scheduled", 
                    "note" : "$note",
                }
            }, 
            { 
                "$out" : "apptslinked"
            }
        ]
    );
    

    然后我将其导出为 JSON,删除 appts 表,并使用该文件执行 mongoimport。

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2022-01-10
      • 1970-01-01
      • 2012-11-18
      相关资源
      最近更新 更多