【问题标题】:How to specify the _id field with Mongoose when creating a document in MongoDB?在 MongoDB 中创建文档时如何使用 Mongoose 指定 _id 字段?
【发布时间】:2021-10-06 04:34:13
【问题描述】:

我有一个应用程序,用户使用 Firebase Auth 登录,然后我使用 Mongoose 将用户详细信息存储在 MongoDB 中。这工作正常。但是,当前每个文档的 _id 是随机的。我想将 _id 字段指定为 Firebase 中我已经单独存储的 uid。

这是我的架构:

const UserSchema = new mongoose.Schema({
email: {
    type: String,
},
name: {
    type: String,
},
photoUrl: {
    type: String,
},
token: {
    type: String,
},
uid: {
    type: String,
},
})

我似乎尝试了以下所有变体,但似乎没有任何效果:

_id: {
    type: mongoose.Schema.Types.ObjectId,
},

没有给出错误,只是没有写入 Mongo(如果我不包含 _id 字段,它会这样做)。谁能看看我做错了什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    应该这样做,因为 FB Auth uid 不是 ObjectId

    _id: {
        type: String
    }
    

    【讨论】:

    • ...或简称_id: String
    • 啊,就这么简单!谢谢你。我错误地认为我必须将其转换为 ObjectId。感谢您的宝贵时间。
    【解决方案2】:

    转换_id: String 并不是一个好主意,因为 mongoose 会将其存储为字符串,而不是默认存储为 objectId。由于 objectId 对应于它们的键结构,Mongoose 获取工作效率很高。不幸的是,Firebase id 没有这样做。所以我们不能将我们的 firebase id 转换为 mongoose id。 另一个问题是,如果您想通过 mongoose 方法 type: Schema.Types.ObjectId 将其作为外键保存到另一个集合中,并使用另一个表的 ref 它将不起作用。

    在我看来,最好的方法是使用 mongoose 的密钥来创建 firebase 用户,因为您将使用 mongoose 处理除 firebase auth 之外的所有数据库使用。而且firebase id没有严格的uid结构。你可以用任何东西创建firebase uid。

    const uid = new mongoose.Types.ObjectId()._id
    const firebaseUser = await admin.auth().createUser({ uid: uid.toString(), email: payload.email, password: payload.password });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2019-07-31
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多