Necesito devolver los elementos en los que el stock es menor o igual a la cantidad que recibo del pedido.
En mi documento de producto tengo una propiedad llamada stock que necesito comparar con la cantidad de producto que recibo por el pedido, que es un arreglo con la información del pedido.
Para encontrar los productos con stock igual o menor a la cantidad que proviene de la solicitud, estoy haciendo lo siguiente:
let productHasStock = async ( req, res, next ) => { const details = req.body.detail; let ids = []; let stock = []; const products = details.map( detail => { ids.push(detail._id), stock.push(detail.quantity) }); const product = await Product.find({ stock: { $lte: stock } }).where('_id').in(ids); } Claramente, esto no funciona porque $lte requiere que le pases un número entero y aquí obtienes una matriz.
Si lo ejecuto de esta manera, obviamente funciona:
const product = await Product.find({ stock: { $lte: 20} }).where('_id').in(ids);Pero necesito saber cómo lograrlo con los datos que recibo de la solicitud usando la cantidad y validarlo contra el stock.
En primer lugar, está comparando acciones en findQuery con una matriz, ya que ha declarado acciones como matriz.
let productHasStock = async ( req, res, next ) => { const details = req.body.detail; let ids = []; let stock = []; // here stock is array type const products = details.map( detail => { ids.push(detail._id), stock.push(detail.quantity) }); const product = await Product.find({ stock: { $lte: stock } }).where('_id').in(ids); // here you are comparing array it should be integer. }Y, lógicamente, si tiene stock = ['5', '100'], ¿por qué está pasando una matriz mientras compara acciones en db? Como sabe, el valor más grande en stock es 100, por lo que debe comparar solo 100, ya que solo desea productos que tengan un stock inferior a 100.
const product = await Product.find({ stock: { $lte: 100} }).where('_id').in(ids);Y primero debe encontrar el más grande de la matriz y luego pasarlo a la consulta.
O si desea comparar el producto con la identificación y luego desea comparar el producto de identificación específico con el stock de ese producto, entonces lógicamente ese no es el buen enfoque que está utilizando. Así que escriba una canalización agregada en mongoose para encontrar el producto específico con id y compare también su stock.
Supongo que la consulta es para encontrar solicitudes de compra de acciones que no se pueden cumplir por completo. Cada solicitud puede ser una cláusula en el find "$or" . Por supuesto, aún necesitará transformar la solicitud de datos en la consulta de find .
db.Product.find({ // Each data request is part of "$or" "$or": [ { "_id": 0, "stock": { "$lte": 200 } }, { "_id": 2, "stock": { "$lte": 100 } }, { "_id": 5, "stock": { "$lte": 500 } }, { "_id": 7, "stock": { "$lte": 300 } } ] })Pruébalo en mongoplayground.net .