Moongoose Aggregat $match nicht mit id ' s
Möchte ich zeigen, Produkte von ids (56e641d4864e5b780bb992c6
und 56e65504a323ee0812e511f2
) und zeigen Sie den Preis nach subtrahiert von Rabatt, wenn verfügbar.
Ich zählen kann der endgültige Preis mit Aggregat, aber diese Rückkehr alle Dokument in einer Sammlung, wie man es wieder nur die Spiele-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)
dies ist meine Abfrage
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)
}
})
und wenn ich dies hinzufügen $in
Abfrage gibt, gibt es leeres array
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)
}
})
InformationsquelleAutor Muhammad Fasalir Rahman | 2016-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
ids
variable konstruiert werden, von "strings", und nichtObjectId
Werte.Mongoose "autocasts" string-Werte für
ObjectId
in Ihre richtigen Typ in regelmäßigen Abfragen, aber diese nicht zufällig in der aggregation pipeline, wie beschrieben in Ausgabe #1399.Stattdessen müssen Sie die richtige Besetzung für Typ manuell:
Dann können Sie Sie in Ihre pipeline-Stufe:
Der Grund ist, weil die aggregation Rohrleitungen "in der Regel" ändern Sie die Dokument-Struktur, und daher Mungo macht auch nicht davon ausgegangen werden, dass das "schema" für das Dokument gilt, in einer bestimmten pipeline-Phase.
Ist es vertretbar, dass die "erste" pipeline-Stufe, wenn es ein
$match
Bühne sollte dies tun, da ja das Dokument wird nicht verändert. Aber das ist im Augenblick noch nicht, wie es passiert.Alle Werte, die möglicherweise "strings", oder zumindest nicht die richtige BSON-Typ müssen manuell gegossen, um zu entsprechen.
Das ist genau, was ich antwortete. Ein
.find()
können dieSchema
die hat natürlich einen Standard-Typ vonObjectId
für die_id
Feld. Aggregation pipelines jedoch nicht verwenden Sie dieSchema
, als ich eigentlich schon erklärt.Dies ist nicht im Mungo 5
hat mich drei Tage, um hier, seufz.. ich erstellte eine lamda in meinem schema-statische Methode
const castUserId = (userId) => mongoose.Types.ObjectId(userId)
jetzt bin ich glücklichInformationsquelleAutor Blakes Seven