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