Bedenkt man, wie würde ich es effizient umwandeln MongoDB:Wie diese SQL-Abfrage konvertieren, diese Abfrage in SQL Server geschrieben MongoDB
select * from thetable where column1 = column2 * 2
Bedenkt man, wie würde ich es effizient umwandeln MongoDB:Wie diese SQL-Abfrage konvertieren, diese Abfrage in SQL Server geschrieben MongoDB
select * from thetable where column1 = column2 * 2
können Sie unter Aggregation verwenden.
Sie projizieren ein neues Feld comp
den Ausdruckswert von $match
gefolgt berechnen Sie die Dokumentation zu halten mit eq (0) Wert und $project
unter Ausschluß comp
Feld fallen zu lassen.
db.collection.aggregate([
{ $addFields: {"comp": {$cmp: ["$column1", {$multiply: [ 2, "$column2" ]} ]}}},
{ $match: {"comp":0}},
{ $project:{"comp":0}}
])
Wenn Sie Ihre Abfrage in Mongo Shell ausführen möchten, versuchen Sie Code unten,
db.thetable .find({}).forEach(function(tt){
var ttcol2 = tt.column2 * 2
var comapreCurrent = db.thetable.findOne({_id : tt._id,column1 : ttcol2});
if(comapreCurrent){
printjson(comapreCurrent);
}
});
mochte ich die Antwort von @Veeram geschrieben, aber es wäre auch möglich, dies mit $ Projekt zu erreichen und $ match pipeline operation. Dies wird nur für das Verständnis des Flusses
Angenommen, wir haben die unter 2 gespeicherten Dokumente in einer Mathe Sammlung
Mongo Dokumente
{ "_id" : ObjectId("58a055b52f67a312c3993553"), "num1" : 2, "num2" : 4 } { "_id" : ObjectId("58a055be2f67a312c3993555"), "num1" : 2, "num2" : 6 }
Jetzt brauchen wir, wenn num1 finden = 2 mal von num2 (In unserem Fall stimmt das Dokument mit _id ObjectId ("58a055b52f67a312c3993553") mit dieser Bedingung überein)
Abfrage:
db.math.aggregate([ { "$project": { "num2": { "$multiply": ["$num2",1] }, "total": { "$multiply": ["$num1",2] }, "doc": "$$ROOT" } }, { "$project": { "areEqual": {"$eq": ["$num2","$total"] }, doc: 1 } }, { "$match": { "areEqual": true } }, { "$project": { "_id": 1, "num1": "$doc.num1", "num2": "$doc.num2" } } ])
Pipeline Betriebsschritte: -
Hinweis: - In der ersten Pipeline-Operation habe ich multiplizierten num2 mit 1 als num1 und num2 werden als ganze Zahlen gespeichert und $ gibt mehrfach doppelten Wert. Wenn ich also nicht $ multiply für num2 verwende, dann versucht es, 4 gleich 4.0 zu finden, was nicht mit dem Dokument übereinstimmt.
Sicherlich keine Notwendigkeit für mehrere Pipeline-Stufen, wenn eine einzelne $redact
Pipeline ausreichen, da es schön, die Funktionalität von $project
und $match
Pipeline Schritte umfasst. Betrachten Sie die folgende Pipeline für eine effiziente Abfrage ausgeführt wird:
db.collection.aggregate([
{
"$redact": {
"$cond": [
{
"$eq": [
"$column1",
{ "$multiply": ["$column2", 2] }
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
Im obigen $redact
werden alle Dokumente, die die Bedingung übereinstimmen mit $$KEEP
und verwirft diejenigen, die nicht übereinstimmen, die $$PRUNE
System Variable.