El caso es que @Diego está en lo correcto.
Un par de apuntes:
- No es generalmente buena práctica hacer un array de puntuaciones en el modelo de vino, porque termina eventualmente uno sin espacio (recuerda que un documento no puede exceder el tamaño determinado por su
BSON
), y esto no es bueno si el vino va a tener…¿20.000 puntuaciones? Aparte de todo lo anterior, se hará más fácil hacer unaggregator
desde un modelo y no a nivel de documentos. En ese caso en el modelo de puntuación es donde se hace la referencia al vino. Caso diferente al de los comentarios, donde por norma general no son muchos, pero si lo son, la misma cosa. - Lo normal, programar en un solo idioma, eso de combinar inglés con español a veces es un tanto raro. Además, usar
camelCase
en lugar desnake_case
, ya que bueno…¡es Javascript!
Ahora si, empecemos:
En el archivo del modelo Wine
const mongoose = require('mongoose'), Schema = mongoose.Schema;let wineSchema = new Schema({ name: { type: String, required: true }, code: { type: String, required: true }, type: { type: String, enum: [ 'Tinto', 'Rosado', 'Blanco' ], required: true }, winery: { type: String, required: true }, grapeType: { type: String, required: true }, year: { type: Number, required: true }, alcohol: { type: Number, required: true }, comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }]});module.exports = new mongoose.model('Wine', wineSchema);
En el archivo del modelo Rate
const mongoose = require('mongoose'), Schema = mongoose.Schema, ObjectId = mongoose.Types.ObjectId;let rateSchema = new Schema({ user: { type: Schema.Types.ObjectId, ref: "User", required: true }, wine: { type: Schema.Types.ObjectId, ref: "Wine", required: true }, rate: { type: Number, required: true }});rateSchema.statics.avg = function(wineId){ return new Promise((resolve, reject) => { this.aggregate([{ $match: { wine: new ObjectId(wineId) } }, { $group: { _id: '$wine', rate: { $avg: '$rate' } } }], (error, results) => { if(error) return reject(error); return resolve(results); }); });};module.exports = mongoose.model('Rate', rateSchema);