2016-08-06 108 views
0

以下查詢無效。任何人都可以請指出我的錯誤?對數組中最後一個元素值的MongoDb過濾器

我試圖過濾Progress數組中最後一個項目具有給定狀態的所有文檔 - 例如「完成」。 (應匹配- 因爲在進步陣列最後的狀態是「INPROGRESS」

db.logdata.aggregate(
    [ 
     { "$match": { "ProcessingInfo.Progress" : { "$exists": true } } }, 
     { "$redact": 
      { 
       "$cond": { 
        "if": { "$eq": [ { "$arrayElemAt": [ "$ProcessingInfo.Progress.State", -1 ], "Done" } ] }, 
        "then": "$$KEEP", 
        "else": "$$PRUNE" 
       } 
      } 
     } 

    ] 
) 

示例文件:

{ 
    "_id" : ObjectId("578fa85bb29339a1fa6d6109"), 
    "ProcessingInfo" : { 
     "DateStarted" : ISODate("2016-08-06T16:55:58.294+0000"), 
     "Attempt" : NumberInt(1), 
     "LastState" : "Failed", 
     "Progress" : [ 
      { 
       "State" : "Failed", 
       "StateDescription" : "" 
      }, 
      { 
       "State" : "Success", 
       "StateDescription" : "" 
      }, 
      { 
       "State" : "Done", 
       "StateDescription" : "" 
      }, 
      { 
       "State" : "InProgress", 
       "StateDescription" : "" 
      } 
     ] 
    } 
} 

爲一種「迴避」這個問題我有一個額外的字段在文檔根目錄「LastState」中 - 這可能是要走的路(複雜性)?

+1

樣本文件是你期望的結果是什麼?你使用$ arrayElemAt的方法是錯誤的,它接受一個數組作爲第一個參數,而你傳遞一個字符串 –

回答

0

您的查詢有一個小的語法錯誤:您的"Done"應該在$eq陣列中,而不是包含$arrayElemAt定義的對象。下面的查詢(優化,過濾掉不期望StateProcessInfo.Progress陣列,這要歸功於Styvane建議在任何地方的文件)應該返回您的示例文檔:

[ 
    { "$match": { "ProcessingInfo.Progress.State" : "InProgress" } }, 
    { "$redact": 
     { 
      "$cond": { 
       "if": { "$eq": [ { "$arrayElemAt": [ "$ProcessingInfo.Progress.State", -1 ] }, "InProgress" ] }, 
       "then": "$$KEEP", 
       "else": "$$PRUNE" 
      } 
     } 
    } 
] 
+3

'{「$ match」:{「ProcessingInfo.Progress.State」:「完成」}}'會更好。 – styvane

+0

@Styvane的確,我用你的建議更新了答案。謝謝! – Nicolas

相關問題