2017-02-12 37 views

回答

4

您可以使用下面聚集。

您項目的新領域comp計算表達式的值,然後$match保持文檔與EQ(0)值和$project與排斥下降comp領域。

db.collection.aggregate([ 
    { $addFields: {"comp": {$cmp: ["$column1", {$multiply: [ 2, "$column2" ]} ]}}}, 
    { $match: {"comp":0}}, 
    { $project:{"comp":0}} 
]) 
1

如果你想運行在蒙戈殼牌查詢, 嘗試下面的代碼,

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

我喜歡張貼@Veeram的答案,但它也有可能實現這一目標使用$項目和$匹配流水線操作。 這僅僅是理解流動

假設我們有存儲在數學收集

蒙戈文件

 

    { 
     "_id" : ObjectId("58a055b52f67a312c3993553"), 
     "num1" : 2, 
     "num2" : 4 
    } 

    { 
     "_id" : ObjectId("58a055be2f67a312c3993555"), 
     "num1" : 2, 
     "num2" : 6 
    } 

下面的2個文件現在我們需要找到,如果NUM1 = num2的2倍(在我們的例子中,具有_id ObjectId(「58a055b52f67a312c3993553」)的文檔將與此條件匹配)

查詢:

 

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

流水線操作步驟: -

  • 第1流水線操作$項目計算總
  • 第二屆流水線操作$項目使用檢查總數 是否與num2匹配。因爲我們不能在$比賽流水線操作,如果
  • 第四流水線操作$項目只是用於投影領域
  • areEqual是真的
  • 第三流水線操作相匹配使用NUM2的對比 操作,總這是必要的

注: - 在第1流水線操作我成倍NUM2 1爲NUM1和NUM2存儲爲整數,$乘返回double值。因此,如果我不使用$ mutiply作爲num2,那麼它會嘗試匹配4等於4.0,這與文檔不匹配。

0

當然無需多流水線階段,當一個$redact管道就足夠了,因爲它結合了精美的$project$match流水線步驟的功能。考慮運行下面的管道進行高效的查詢:

db.collection.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { 
        "$eq": [ 
         "$column1", 
         { "$multiply": ["$column2", 2] } 
        ] 
       }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]) 

在上面,$redact將返回匹配使用$$KEEP,並丟棄那些不使用$$PRUNE系統符合條件的所有文件變量。