2016-08-06 57 views
0

Die folgende Abfrage ist nicht gültig. Kann mir bitte jemand auf den Fehler hinweisen?MongoDb Filter auf Wert des letzten Elements in einem Array

Ich versuche, auf alle Dokumente zu filtern, bei denen der letzte Eintrag im Array Progress einen bestimmten Status hat - zum Beispiel "Fertig".

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

    ] 
) 

Beispieldokument (, die angepasst werden sollte - weil der letzte Staat in Progress Array "InProgress" ist):

{ 
    "_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" : "" 
      } 
     ] 
    } 
} 

Um Art "umgehen" dieses Problem habe ich ein zusätzliches Feld in der Document-Root "LastState" - ist das vielleicht der Weg zu gehen (complexity-weise)?

+1

Das Beispieldokument ist das, was Sie als Ergebnis erwarten? Die Art, wie Sie $ arrayElemAt verwenden, ist falsch, es akzeptiert ein Array als ersten Parameter, während Sie eine Zeichenfolge übergeben –

Antwort

0

Ihre Suche hat ein wenig Syntaxfehler: Ihre "Done" im $eq Array sein sollte, nicht in dem Objekt enthält $arrayElemAt Definition. Die folgende Abfrage (optimierte Dokumente zu filtern, ohne die erwarteten State überall in dem ProcessInfo.Progress Array dank was Styvane vorgeschlagen) soll Ihr Beispiel Dokument zurück:

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

'{" $ match ": {" ProcessingInfo.Progress.State ":" Done "}} wird besser. – styvane

+0

@Styvane, in der Tat habe ich die Antwort mit Ihrem Vorschlag aktualisiert. Vielen Dank! – Nicolas