【问题标题】:what is the purpose of declaring mongoose.Schema.Types.ObjectId?声明 mongoose.Schema.Types.ObjectId 的目的是什么?
【发布时间】:2019-03-02 00:24:12
【问题描述】:

我一直在浏览一些 nodejs/mongoose 代码,我意识到有一些代码在尝试将数据存储在 mongodb-mongoose 中时明确定义了 _id 字段。

例子

var personSchema = Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: String,
    age: Number,
    stories: [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});

我知道 Mongodb 中的文档默认分配了一个唯一的 _id 字段。那为什么还有人要定义“_id: mongoose.Schema.Types.ObjectId”,这有什么好处呢?我的意思是,不管他们定义与否,它不会仍然存在吗?

【问题讨论】:

    标签: node.js mongodb mongoose nosql


    【解决方案1】:

    Mongoose 架构旨在在每个创建的文档或子文档(嵌入)条目中添加 _id 字段。

    声明_id 字段仅在模式中有用,当您想要将模型文档的某些字段嵌入为子文档而不是添加带有原始 id 的 ref 时,否则它将添加新生成的 ObjectId 作为_id 在子文档架构中。

    【讨论】:

      【解决方案2】:

      从技术上讲,在顶级架构级别声明与否之间没有变化。


      正如documentation of mongoose 所说:

      默认情况下,Mongoose 会为您的每个模式分配一个 _id 字段,如果有的话 没有传递到 Schema 构造函数中。分配的类型是一个 ObjectId 以符合 MongoDB 的默认行为。


      有些人可能会添加它以使其明确:_id 字段存在并且它是ObjectId



      注意在子模式中,_id 可以使用 _id 选项禁用

      选项

      _id Mongoose 为您的每个模式分配一个 _id 字段 如果未将一个传递给 Schema 构造函数,则为默认值。方式 分配的是一个 ObjectId 以符合 MongoDB 的默认行为。 如果您根本不想将 _id 添加到您的架构中,您可以禁用 它使用这个选项。

      您只能在子文档上使用此选项。猫鼬无法保存 不知道其 id 的文档,因此如果您尝试会收到错误消息 保存没有 _id 的文档。

      // default behavior
      var schema = new Schema({ name: String });
      var Page = mongoose.model('Page', schema);
      var p = new Page({ name: 'mongodb.org' });
      console.log(p); // { _id: '50341373e894ad16347efe01', name: 'mongodb.org' }
      
      // disabled _id
      var childSchema = new Schema({ name: String }, { _id: false });
      var parentSchema = new Schema({ children: [childSchema] });
      
      var Model = mongoose.model('Model', parentSchema);
      
      Model.create({ children: [{ name: 'Luke' }] }, function(error, doc) {
        // doc.children[0]._id will be undefined
      });
      

      【讨论】:

        猜你喜欢
        • 2011-08-14
        • 2021-01-05
        • 2016-11-28
        • 2012-07-13
        • 2013-05-17
        • 2010-12-20
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        相关资源
        最近更新 更多