2013-06-02 13 views
15

Quando si crea un documento con oggetti nidificati (ad esempio una matrice di oggetti), a ogni oggetto viene assegnato il proprio _id. Ad esempio, il mio schema è simile al seguente:Mongoose aggiunge _id a tutti gli oggetti nidificati

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 

Ogni oggetto dell'array lists prova un _id, come è ogni allocation oggetto dell'array lists.allocations, quando i documenti vengono creati alla fine. Questo sembra un eccesso e un eccesso del documento, ma c'è un motivo per cui MongoDB (o Mongoose) ha bisogno che il documento contenga queste informazioni aggiuntive? In caso contrario, mi piacerebbe evitare che accada in modo che l'unico _id è sul documento di root.

Inoltre, Mongoose crea automaticamente un id virtuale per _id, di cui ho bisogno perché il mio codice client si aspetta un campo id. Questo è il motivo per cui sto facendo tornare i virtual con JSON. Tuttavia, poiché ci sono campi _id in tutto il documento, non solo nella radice, questo virtuale duplica tutti di di essi. Se non c'è modo di impedire i campi _id aggiuntivi, come posso ottenere un virtual che si applica solo al documento root _id? O se c'è un modo migliore per fare quello che sto cercando di fare con esso, quale sarebbe?

risposta

11

Ho trovato un modo per risolvere entrambi i problemi con la stessa tecnica: utilizzando schemi espliciti per ogni tipo di oggetto nidificato e impostando le loro opzioni _id e id su false. Sembra che quando si annidano oggetti definiti "in linea", Mongoose crea schemi per ciascuno di quegli oggetti dietro le quinte. Poiché il valore predefinito per uno schema è _id: true e id: true, otterrà un _id e un id virtuale. Ma sovrascrivendo questo con uno schema esplicito, posso controllare la creazione di _id. Più codice, ma ottengo ciò che voglio:

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 
+11

Nella versione (3.6) sono in grado di aggiungere semplicemente _id: false nei sottodoc direttamente nello schema principale senza la necessità di creare sottosistemi separati – cyberwombat

+1

Se stai cercando una soluzione JavaScript: http://stackoverflow.com/questions/17254008/stop-mongoose-from-created-ids-for- sottodocument-array –

2

@neverfox grazie per info, ho semplicemente aggiungendo il codice per 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], 
}); 
+0

FYI Sono stato in grado di utilizzare solo false invece di {id: false} per il valore di _id in subdocuments –

Problemi correlati