2016-08-06 4 views
0

다음 쿼리는 유효하지 않습니다. 누구든지 오류를 가르쳐 주시겠습니까?배열의 마지막 요소 값에 대한 MongoDb 필터

Progress 배열의 마지막 항목에 주어진 상태 (예 : "완료")가있는 모든 문서를 필터링하려고합니다. (일치해야 - 진행 배열의 마지막 국가가 "진행중"때문에)

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

샘플 문서가 당신이 결과로 기대하는 것입니다 : (어디 Styvane이 어떤 제안에 ProcessInfo.Progress 배열 덕분에 예상 State없이 문서를 필터링하도록 최적화) 다음 쿼리는 귀하의 예제 문서를 반환해야합니까? $ arrayElemAt를 사용하는 방식이 잘못되었습니다. 배열을 첫 번째 매개 변수로 받아들이는 반면 문자열을 전달하면 –

답변

0

검색어에 약간의 구문 오류가 있습니다. "Done"$arrayElemAt 정의가 포함 된 개체가 아니고 이 $eq 배열에 있어야합니다.

[ 
    { "$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

관련 문제