如何使用Mongodb中另一个表的_id更新一个表

如何使用Mongodb中另一个表的_id更新一个表,mongodb,mongoose,Mongodb,Mongoose,我将MySQL数据库中的数据导出为JSON,并将其导入MongoDB。问题是: 当我导入客户机时,MongoDB创建了自己的_id字段(我知道这是内置的功能,但MySQL使用了clientID,自动递增整数) 因此,当我导入约会集合时,clientID被重命名为oldClientID。我希望clientID字段是相应客户端的ObjectID 我的模式: const apptSchema = new mongoose.Schema({ ID: Number, clientID: {

我将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将始终使用
\u id
作为主键,这种行为不能被覆盖,尽管您可以将
\u id
与自定义id中的值一起使用。尽管这可能会让人困惑,但最好对自定义id使用索引,并且您不需要对自定义索引字段使用
ObjectId
,但可以使用您自己的自定义id架构,如
UUID
或递增整数值等,尽管它必须由您或某些框架生成/递增,如
JPA

检查


对于猫鼬,你可以这样做

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

有了

Ok,这对我来说是可行的,尽管我确信必须有一个更简单的方法:

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。

噢!我不知道我能做到。我最终使用了一个带有查找阶段的聚合查询,然后将表中的_id投影到clientID字段中。将其保存为新表,并通过mongo方式连接。谢谢你!我喜欢这个主意@我明白了,但是您仍然可以在默认的模式创建步骤中将自定义字段作为
\u id
传递,但通常忽略
\u id
,并且自定义字段与索引一起使用