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],
});