使用嵌套对象(例如对象数组)创建文档时,每个对象都有自己的_id。例如,我的架构如下所示:
mongoose = require "mongoose"
Schema = mongoose.Schema
schema = new Schema
name:
type: String
required: true
unique: true
trim: true
lists: [
list:
type: Schema.Types.ObjectId
required: true
ref: "List"
allocations: [
allocation:
type: Number
required: true
]
]
createdAt:
type: Date
default: Date.now
updatedAt:
type: Date
# Ensure virtual fields are serialised.
schema.set "toJSON",
virtuals: true
exports = module.exports = mongoose.model "Portfolio", schema
最终创建文档时,lists
数组中的每个对象都被赋予_id,而allocation
数组中的每个lists.allocations
对象都被赋予_id。这似乎有点过分并使文档膨胀,但MongoDB(或Mongoose)是否需要该文档来包含这些附加信息?如果没有,我想阻止它发生,以便唯一的_id在根文档上。
此外,Mongoose会自动为id
创建一个虚拟_id
,这是我需要的,因为我的客户端代码需要一个字段id
。这就是我使用JSON返回虚拟的原因。但是,因为整个文档中都有_id
个字段,而不仅仅是根目录,所以这个虚拟副本全部。如果无法阻止其他_id字段,我如何才能将虚拟仅应用于根文档_id?或者,如果有更好的方法来做我正在尝试做的事情,它会是什么?
答案 0 :(得分:15)
我找到了一种使用相同技术解决这两个问题的方法:为每个嵌套对象类型使用显式模式,并将_id
和id
选项设置为false
。似乎在嵌套定义“内联”的对象时,Mongoose会为幕后的每个对象创建模式。由于架构的默认值为_id: true
和id: true
,因此它们将获得_id
以及虚拟id
。但是通过使用显式模式覆盖它,我可以控制_id
创建。更多代码,但我得到了我想要的东西:
mongoose = require "mongoose"
Schema = mongoose.Schema
AllocationSchema = new Schema
allocation:
type: Number
required: true
,
_id: false
id: false
mongoose.model "Allocation", AllocationSchema
ListsSchema = new Schema
list:
type: Schema.Types.ObjectId
required: true
ref: "List"
allocations: [AllocationSchema]
,
_id: false
id: false
mongoose.model "Lists", ListsSchema
PortfolioSchema = new Schema
name:
type: String
required: true
unique: true
trim: true
lists: [ListsSchema]
createdAt:
type: Date
default: Date.now
updatedAt:
type: Date
答案 1 :(得分:2)
@neverfox感谢您的信息,我只是添加了Nodejs的代码
var _incidents = mongoose.Schema({
name : {type : String},
timestamp: {type : Number},
_id : {id:false}
});
_schema = mongoose.Schema({
_id: {type: String, required: true},
user_id: {type: String, required: true},
start_time: {type: Number, required: true},
incidents : [_incidents],
});