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


227

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

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

有没有办法告诉猫鼬不要为数组内的对象创建ID?

Answers:


288

很简单,您可以在以下子模式中定义它:

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);

2
是否_id仅在subSchema集合中,或者仅在使用subSchema作为子文档项数组嵌入的情况下,才跳过字段?我之所以这么问,尤其是因为我今天对SO 提出了自己的问题
网络用户

1
我使用了两个级别的嵌套子模式集合。换句话说,我有一个与您的示例相似的subSchema集合。其中,我使用了另一个不同的子模式集合。我只希望第一级子模式模型实例不使用ID,但是第二级(嵌套)子模式模型实例需要具有ID。当我使用您的解决方案时,即指定{ _id: false },子模式的两个级别都没有ID。有什么办法可以解决此问题?
网络用户

1
您尝试过设置第三级{ _id : true }吗?
throrin19 '16

我昨天尝试的方法是将this更改为:let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });this,let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });并停止了在子文档数组中对象上的_id创建,studentSchema但保留_id了该对象上的创建performance。不知道这两个_id: falseid: false需要。
网络用户

谢谢,对我最好的方法。
Swetabja Hazra

128

您可以创建没有模式的子文档,并避免使用_id。只需添加_id:false到您的子文档声明中即可。

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

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

在猫鼬中测试 v5.9.10


42

另外,如果使用对象文字语法指定子模式,则也可以添加限制_id: false

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

26

我正在使用猫鼬4.6.3,我所要做的就是在模式中添加_id:false,无需进行子模式处理。

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

有没有办法使整个收藏系列与众不同?
琦玉

可能不是使用这种方法,但是您可以随时尝试。_id是字段而不是约束。
jemiloii

如果在创建该子文档期间,我明确指定_id = mongoose.Types.ObjectId(),那么_id在整个集合中是唯一的吗?
Sa玉

只需打开一个新的堆栈溢出,这样您就可以让很多人立即回答
〜– jemiloii

4

您可以使用任何一个

var subSchema = mongoose.Schema({
//subschema fields    

},{ _id : false });

要么

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

});

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


1

如果要使用预定义的架构(具有_id)作为子文档(不具有_id),则理论上可以执行以下操作:

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

但这对我没有用。所以我补充说:

delete subSourceSchema.paths._id;

现在,我可以在不带_id的父文档中包含subSourceSchema。我不确定这是否是干净的方法,但是它可以工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.