Mongoose добавляет _id ко всем вложенным объектам
При создании документа с вложенными объектами (например, массивом объектов) каждому объекту присваивается свой собственный _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
, когда документы в конечном итоге создаются. Это кажется излишним и раздутым документом, но есть ли причина, по которой MongoDB (или Mongoose) нуждается в документе, чтобы содержать эту дополнительную информацию? Если нет, я бы хотел, чтобы это не произошло, так что единственный _id находится в корневом документе.
Кроме того, Mongoose автоматически создает виртуальный id
для _id
, который мне нужен, потому что мой клиентский код ожидает поле id
. Вот почему у меня есть виртуальные машины, возвращенные с JSON. Однако, поскольку во всем документе есть поля _id
, а не только в корне, этот виртуальный дублирует их все. Если нет возможности предотвратить дополнительные поля _id, как я могу заставить виртуальную машину применять только к корневому документу _id? Или, если есть лучший способ сделать то, что я пытаюсь сделать с ним, что бы это было?
Ответы
Ответ 1
Я выяснил способ решения обеих проблем с помощью одного и того же метода: используя явные схемы для каждого типа вложенных объектов и установив их параметры _id
и id
в false
. Кажется, что при вложенности объектов, которые вы определяете "inline", 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
Ответ 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],
});