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

时间:2013-06-22 18:28:36

标签: node.js mongodb mongoose subdocument

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

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

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

6 个答案:

答案 0 :(得分:228)

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

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

答案 1 :(得分:109)

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

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

这将阻止在您的subdoc中创建_id字段。在Mongoose 3.8.1中测试

答案 2 :(得分:38)

此外,如果您使用对象文字语法来指定子架构,您也可以添加_id: false来压制它。

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

答案 3 :(得分:17)

我使用的是mongoose 4.6.3,而我所要做的只是在架构中添加_id:false,而不需要制作子模式。

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

答案 4 :(得分:3)

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

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

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

delete subSourceSchema.paths._id;

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

答案 5 :(得分:1)

您可以使用其中任何一个

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

},{ _id : false });

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

});

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