阻止 Mongoose 为子文档数组项创建 _id 属性
Posted
技术标签:
【中文标题】阻止 Mongoose 为子文档数组项创建 _id 属性【英文标题】:Stop Mongoose from creating _id property for sub-document array items 【发布时间】:2017-03-02 15:37:10 【问题描述】:如果您有子文档数组,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: false
和 id: 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 属性的主要内容,如果未能解决你的问题,请参考以下文章