阻止 Mongoose 为子文档数组项创建 _id 属性

Posted

技术标签:

【中文标题】阻止 Mongoose 为子文档数组项创建 _id 属性【英文标题】:Stop Mongoose from creating _id property for sub-document array items 【发布时间】:2018-11-14 19:43:15 【问题描述】:

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


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

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

【问题讨论】:

【参考方案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。 我不确定这是不是干净的方法,但它确实有效。

【讨论】:

以上是关于阻止 Mongoose 为子文档数组项创建 _id 属性的主要内容,如果未能解决你的问题,请参考以下文章

阻止 Mongoose 为子文档数组项创建 _id 属性

阻止 Mongoose 为子文档数组项创建 _id 属性

阻止 Mongoose 为子文档数组项创建 _id 属性

阻止 Mongoose 为子文档数组项创建 _id 属性

阻止 Mongoose 为子文档数组项创建 _id 属性

阻止 Mongoose 为子文档数组项创建 _id 属性