Voglio mostrare i prodotti per ID (56e641d4864e5b780bb992c6
e 56e65504a323ee0812e511f2
) e mostrare il prezzo dopo averlo sottratto dallo sconto se disponibile.
posso contare il prezzo finale utilizzando aggregata, ma questo ritorno tutti i documenti in una collezione, come farlo tornare solo le partite ids
"_id" : ObjectId("56e641d4864e5b780bb992c6"),
"title" : "Keyboard",
"discount" : NumberInt(10),
"price" : NumberInt(1000)
"_id" : ObjectId("56e65504a323ee0812e511f2"),
"title" : "Mouse",
"discount" : NumberInt(0),
"price" : NumberInt(1000)
"_id" : ObjectId("56d90714a48d2eb40cc601a5"),
"title" : "Speaker",
"discount" : NumberInt(10),
"price" : NumberInt(1000)
questa è la mia domanda
productModel.aggregate([
{
$project: {
title : 1,
price: {
$cond: {
if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price"
}
}
}
}
], function(err, docs){
if (err){
console.log(err)
}else{
console.log(docs)
}
})
e se aggiungo questo $in
query, restituisce array vuoto
productModel.aggregate([
{
$match: {_id: {$in: ids}}
},
{
$project: {
title : 1,
price: {
$cond: {
if: {$gt: ["$discount", 0]}, then: {$subtract: ["$price", {$divide: [{$multiply: ["$price", "$discount"]}, 100]}]}, else: "$price"
}
}
}
}
], function(err, docs){
if (err){
console.log(err)
}else{
console.log(docs)
}
})
Ecco, ora funziona. ma di solito lancio l'id come stringa in findOneAndUpdate o in un'altra query, e funziona bene, il problema si verifica solo in forma aggregata? –
@MuhammadFasalirRahman Questo è esattamente ciò a cui ho risposto. Un '.find()' può usare lo 'Schema' che ovviamente ha un tipo predefinito di' ObjectId' per il campo '_id'. Le condutture di aggregazione non ** usano ** lo schema, come ho già spiegato. –
Questo non funziona in mangusta 5 –