【问题标题】:Stop Mongoose from creating _id property for sub-document array items阻止 Mongoose 为子文档数组项创建 _id 属性
【发布时间】:2019-09-13 15:11:39
【问题描述】:

如果您有子文档数组,Mongoose 会自动为每个数组创建 id。示例:

{
    _id: "mainId"
    subDocArray: [
      {
        _id: "unwantedId",
        field: "value"
      },
      {
        _id: "unwantedId",
        field: "value"
      }
    ]
}

有没有办法告诉 Mongoose 不要为数组中的对象创建 id?

【问题讨论】:

    标签: node.js mongodb mongoose subdocument


    【解决方案1】:

    很简单,你可以在子模式中定义这个:

    var mongoose = require("mongoose");
    
    var subSchema = mongoose.Schema({
        // your subschema content
    }, { _id : false });
    
    var schema = mongoose.Schema({
        // schema content
        subSchemaCollection : [subSchema]
    });
    
    var model = mongoose.model('tablename', schema);
    

    【讨论】:

    • 这是否会跳过 _id 字段,即使在 subSchema 集合中,还是仅在 subSchema 用于嵌入子文档项数组的情况下?我之所以这么问,是因为我今天在 SO 上拥有自己的 question
    • 我使用了两层嵌套的子模式集合。换句话说,我有一个类似于您的示例的 subSchema 集合。在其中,我使用了另一个不同的子模式集合。我只希望第一级子模式模型实例不使用 id,但第二级(嵌套)子模式模型实例需要有 id。当我使用您的解决方案时,即指定{ _id: false },子模式的两个级别都没有ID。有什么办法可以解决这个问题?
    • 你有没有试过,为第三级设置{ _id : true }
    • 我昨天尝试的是将这个:let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false }); 更改为这个:let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }); 并停止在studentSchema 上创建_id,但在@987654331 中的对象上保留_id 创建@ 子文档数组。不确定是否需要 _id: falseid: false
    【解决方案2】:

    您可以创建没有架构的子文档并避免_id。只需将_id: false 添加到您的子文档声明中即可。

    var schema = new mongoose.Schema({
       field1: {
          type: String
       },
       subdocArray: [{
          _id: false,
          field: { type: String }
       }]
    });
    

    这将阻止在您的子文档中创建 _id 字段。

    在猫鼬v5.9.10中测试

    【讨论】:

      【解决方案3】:

      另外,如果你使用对象字面量语法来指定子模式,你也可以只添加_id: false 来抑制它。

      {
         sub: {
            property1: String,
            property2: String,
            _id: false
         }
      }
      

      【讨论】:

        【解决方案4】:

        我使用的是 mongoose 4.6.3,我所要做的就是在架构中添加 _id: false,无需创建子架构。

        {
            _id: ObjectId
            subDocArray: [
              {
                _id: false,
                field: "String"
              }
            ]
        }
        

        【讨论】:

        • 有没有办法让整个系列变得独一无二?
        • 这个方法可能不行,但你可以试试。 _id 是一个字段而不是一个约束。
        • 如果在创建该子文档期间,我明确分配了_id = mongoose.Types.ObjectId(),那么该_id 在集合中是否是唯一的?
        • 随便开一个新的栈溢出,这样就可以让很多人同时回答~
        【解决方案5】:

        你可以使用其中任何一个

        var subSchema = mongoose.Schema({
        //subschema fields    
        
        },{ _id : false });
        

        var subSchema = mongoose.Schema({
        //subschema content
        _id : false    
        
        });
        
        

        在使用第二个选项之前检查你的猫鼬版本

        【讨论】:

          【解决方案6】:

          如果您想使用预定义的架构(带_id)作为子文档(不带_id),理论上可以这样做:

          const sourceSchema = mongoose.Schema({
              key : value
          })
          const subSourceSchema = sourceSchema.clone().set('_id',false);
          

          但这对我不起作用。所以我补充说:

          delete subSourceSchema.paths._id;
          

          现在我可以在没有 _id 的情况下在我的父文档中包含 subSourceSchema。 我不确定这是不是干净的方法,但它确实有效。

          【讨论】:

            猜你喜欢
            相关资源
            最近更新 更多