2017-04-06 45 views
0

全部 我正在嘗試在MongoDB中進行連接,但也需要檢查條件並對連接返回的內部值進行求和。 我會解釋。 目前我有這個簡單的連接查詢,看起來像這樣:在mongoDB中查詢內部值

db.Sets.aggregate([ 
       { 
        $lookup: 
        { 
         from: "ExecutionTasks", 
         localField: "identifier", 
         foreignField: "setIdentifier", 
         as: "execTask" 
        } 
       } 
      ]) 

它返回的結果如下:

/* 1 */ 
{ 
    "_id" : 1, 
    "name" : "Demo Set", 
    "identifier" : "demo-set", 
    "description" : "Demo Set", 
    "creator" : { 
     "id" : 1, 
     "name" : "admin" 
    }, 
    "createdDate" : ISODate("2017-03-24T20:09:55.120Z"), 
    "updatedDate" : ISODate("2017-03-24T20:09:55.120Z"), 
    "execTask" : [ 
     { 
      "_id" : 1, 
      "isActive" : 1, 
      "type" : "count", 
      "threshold" : { 
       "default" : "0", 
       "deviations" : [] 
      }, 
      "name" : "amishay", 
      "setIdentifier" : "demo-set", 
      "description" : "a", 
      "query" : { 
       "source" : 1, 
       "text" : "select * from t" 
      }, 
      "creator" : { 
       "id" : 1, 
       "name" : "admin" 
      }, 
      "createdDate" : ISODate("2017-03-27T20:03:22.275Z"), 
      "updatedDate" : ISODate("2017-03-27T20:03:22.275Z") 
     }, 
     { 
      "_id" : 2, 
      "isActive" : 0, 
      "type" : "count", 
      "threshold" : { 
       "default" : "0", 
       "deviations" : [] 
      }, 
      "name" : "amishay2", 
      "setIdentifier" : "demo-set", 
      "description" : "test", 
      "query" : { 
       "source" : 1, 
       "text" : "select * from t" 
      }, 
      "creator" : { 
       "id" : 1, 
       "name" : "admin" 
      }, 
      "createdDate" : ISODate("2017-03-27T20:03:57.248Z"), 
      "updatedDate" : ISODate("2017-03-27T20:03:57.248Z") 
     } 
    ] 
} 

我想這樣做的是隻返回數組的長度(execTask ),也只有那些擁有它等於1 所以基本上我想要得到的東西,如屬性isActive:

{ 
     "_id" : 1, 
     "name" : "Demo Set", 
     "identifier" : "demo-set", 
     "description" : "Demo Set", 
     "creator" : { 
      "id" : 1, 
      "name" : "admin" 
     }, 
     "createdDate" : ISODate("2017-03-24T20:09:55.120Z"), 
     "updatedDate" : ISODate("2017-03-24T20:09:55.120Z"), 
     "execTask" : 1 
} 

我檢查在線編輯了許多問題,但我只看到了一些查詢集合屬性而不是查詢集合屬性的示例。

謝謝!

回答

0

您可以在$lookup後添加$addFields階段。下面的階段將$filter和計算查詢條件$size

$filter運算符將用於在上述條件中就地過濾execTask數組內容。

Expressions $和$$分別引用字段/聚合運算符/聚合階段和內部變量。

$size運算符計算濾波後的數組長度。

$addFields覆蓋現有字段execTask以將其值與計算的大小替換。

{ 
    $addFields: { 
     "execTask": { 
      $size: { 
       $filter: { 
        input: "$execTask", 
        as: "result", 
        cond: { 
         $eq: ["$$result.isActive", 1] 
        } 
       } 
      } 
     } 
    } 
} 
+0

謝謝!有用! :)爲什麼你不使用sum運算符?你有鏈接解釋所有的聚合選項嗎?我從來沒有見過addFields選項。還有,美元符號的東西。我什麼時候使用它?它看起來像是操作符的前綴,但是我看到在編寫「$ execTask」時也使用了它,並且在編寫「$$ result.isActive」時還使用了2個美元符號......我只是不知道該美元符號的規則以及何時應該使用它。如果你有鏈接和解釋,這將是驚人的。再次感謝! :) –

+0

不客氣。新增鏈接和簡短說明。我不知道你爲什麼提出'$ sum'操作符。另一個選項需要''將'execTask'數組''unwind'嵌入到文件中,然後加上'$ match'來保留'isActive'嵌入式文檔,並使用'$ group'和'$ push'嵌入式文檔返回' execTask'數組並計算'$ size'。如果您有任何問題,請隨時提出更多問題。 – Veeram

+0

謝謝!是的,我還有其他問題。假設我也想創建一個過濾器/排序/跳過一些記錄,所有的邏輯應該在查找和addfields之後出現嗎?我的意思是我想用$ match來匹配輸出集合來查詢,我想添加$ skip和$ limit選項。謝謝! –