2017-02-12 3 views

Antwort

4

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}} 
]) 
1

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); 
    } 
}); 
0

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: -

  • Die erste Pipeline-Operation $ Projekt berechnet die Gesamt
  • Die zweite Pipeline-Operation $ Projekt verwendet wird um zu überprüfen, ob die Summe mit der Nummer 2 übereinstimmt. Dies ist notwendig, da wir nicht den Vergleich Betrieb num2 mit insgesamt in der $ Spiel Pipeline-Operation
  • Die dritte Pipeline-Operation übereinstimmt verwenden können, wenn AreEqual wahr ist
  • Die vierte Pipeline-Operation $ Projekt wird zum Projizieren der Felder nur verwendet

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.

0

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.