Mongoose ajoute id à tous les objets imbriqués

lors de la création d'un document avec des objets imbriqués (par exemple un tableau d'objets), chaque objet reçoit son propre _id. Par exemple, mon schéma ressemble à ceci:

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

Chaque objet dans le lists array est donné un _id, comme tout allocation objet lists.allocations tableau, quand les documents sont éventuellement créés. Cela semble exagérer et gonfler le document, mais y a-t-il une raison pour que MongoDB (ou Mongoose) ait besoin du document pour contenir ces informations supplémentaires? Si non, j'aimerais empêchez - le de se produire de sorte que le seul _id soit sur le document racine.

de plus, Mongoose crée automatiquement un _id, dont j'ai besoin parce que mon code client attend un champ id. C'est pour ça que je fais revenir virtuals avec JSON. Cependant, parce qu'il y a _id champs tout au long du document, pas seulement à la racine, cette copie virtuelle . Si il n'y a aucun moyen d'empêcher les supplémentaires _id champs, comment puis-je obtenir un virtuel pour ne s'appliquer qu'au document racine _id? Ou s'il y a une meilleure façon de faire ce que j'essaie de faire avec, ce serait quoi?

16
demandé sur neverfox 2013-06-02 14:19:39

2 réponses

j'ai trouvé un moyen de résoudre les deux problèmes avec la même technique: en utilisant des schémas explicites pour chaque type d'objet imbriqué et en définissant leur _id et id options false. Il semble que lors de l'imbrication d'objets que vous définissez "inline", Mongoose crée des schémas pour chacun de ces objets dans les coulisses. Car la valeur par défaut pour un schéma est _id: true et id: true, ils obtiendront un _id ainsi que avoir un virtuel id. Mais en dépassant cela avec un schéma explicite, je peux contrôle de l' _id la création. Plus de code, mais j'obtiens ce que je veux:

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
14
répondu neverfox 2013-06-02 11:27:16

@neverfox merci pour l'info, je viens d'ajouter le code pour 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],
});
2
répondu Er. Mohit Agrawal 2016-04-15 06:02:14