Tengo un sistema con mongodb genéricoizado por mongoose en nest js, ¿cómo traigo datos de clientes y productos en la misma solicitud?
en la base de datos los datos son así:
"_id": "621d2137abb45e60cf33a2d4", "product_id": [ "621cedbf79d68fb4689ef0cb", "621cedbf79d68fb4689ef0cb", "621cedbf79d68fb4689ef0cb" ], "client_id": "621d19f890ec693f1d553eff", "price": 597, "__v": 0mi servicio:
findAll() { return this.sealsModel.find().exec(); }De esta manera no funcionó:
findAll() { var a = this.sealsModel.find().exec() return this.sealsModel.aggregate([{ $lookup: { from: 'seals', localField: 'client_id', foreignField: '_id', as: 'client' } }]) .exec() }pero devuelve esto:
"_id": "621d3e0a1c3bcac85f79f7cc", "product_id": [ "621cedbf79d68fb4689ef0cb", "621cedbf79d68fb4689ef0cb", "621cedbf79d68fb4689ef0cb" ], "client_id": "621d19f890ec693f1d553eff", "price": 597, "__v": 0, "client": []Una alternativa al operador $lookup de Mongo es la función de populate de Mongoose. Para usarlo correctamente, primero debe actualizar su modelo.
Debería tener un modelo de cliente que se vea así:
// /models/Client.js const mongoose = require("mongoose"); const clientSchema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, ... // the rest of your fields }); module.exports = mongoose.model('Client', clientSchema);La clave para notar aquí es la última línea. Se hace referencia al modelo como "Cliente".
El cambio que tienes que hacer es principalmente en tu modelo Seal :
// /models/Seal.js const mongoose = require("mongoose"); const sealSchema = mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, client_id: { type: mongoose.Schema.Types.ObjectId, ref: "Client" // We use the same name we gave to our client model in the last file } }); module.exports = mongoose.model('Seal', sealSchema);Luego, en su código, debería poder usar:
const Seal = require("YOUR_PATH/models/Seal.js") Seal.find().populate("client_id")Una nota al margen importante: su modelo muestra la ID de mongo como una cadena
"_id": "621d3e0a1c3bcac85f79f7cc", "client_id": "621d19f890ec693f1d553eff", <--- Asegúrese de que el campo client_id sea del tipo ObjectId o no funcionará:
"client_id": ObjectId("621d19f890ec693f1d553eff")