284

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

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

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

4

6 回答 6

377

这很简单,您可以在 subschema 中定义它:

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);
于 2013-06-22T18:44:01.223 回答
176

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

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

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

在猫鼬中测试v5.9.10

于 2013-12-13T02:43:13.240 回答
53

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

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}
于 2014-05-28T05:12:41.360 回答
29

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

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
于 2016-10-14T23:08:26.580 回答
5

您可以使用其中任何一个

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

},{ _id : false });

或者

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

});

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

于 2019-04-25T06:21:26.437 回答
4

如果您想使用预定义的模式(带 _id)作为子文档(不带 _id),理论上可以执行以下操作:

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

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

delete subSourceSchema.paths._id;

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

于 2020-04-04T09:07:27.580 回答