2016-03-21 13 views
3

Ich habe eine Sammlung mit folgendem Format:

{ 
    "_id": 123, 
    "items": [{ 
     "status" : "inactive", 
     "created" : ISODate("2016-03-16T10:39:28.321Z") 
    }, 
    { 
     "status" : "active", 
     "created" : ISODate("2016-03-16T10:39:28.321Z") 
    }, 
    { 
     "status" : "active", 
     "created" : ISODate("2016-03-16T10:39:28.321Z") 
    } 
    ], 
    "status" : "active" 
} 

Ich mag auf Status Bereich der Artikel als ‚aktiv‘ so dass das Objekt mit dem Status abzufragen ist nur im Array zurückgegeben und außerdem werden nur die letzten 2 in der Abfrage zurückgegeben.

Derzeit verwende ich $ filter für diese Operation, aber ich bin nicht in der Lage $ slice zusammen mit $ filter (ist was ich denke, benötigt für das, was ich will) zu verwenden. Hier finden Sie, wie meine Frage jetzt aussieht:

db.collection('collection').aggregate([ 
{$match: {'status': 'active'}}, 
{ 
    $project: { 
     'items': { 
      $filter: { 
       input: '$items', 
       as: 'item', 
       cond: {$eq: ['$$item.status', 'active'] 
      } 
     } 
    } 
}]); 

Was ich jetzt immer korrektes Ergebnis ist, es ist nur, dass es alles gibt die Objekte in dem Artikel Feld und ich möchte nur die letzten 2 Objekte.

Antwort

9

Um die letzten beiden Elemente zu erhalten, verwenden Sie den Operator $slice und setzen Sie den position-Operanden auf -2. Natürlich ist der erste Operand für den Slice-Operator der Ausdruck $filter, der in ein Array aufgelöst wird.

db.collection.aggregate([ 
    { "$match": { "items.status": "active" } }, 
    { "$project": { 
     "items": { 
      "$slice": [ 
       { "$filter": { 
        "input": "$items", 
        "as": "item", 
        "cond": { "$eq": [ "$$item.status", "active" ] } 
       }}, 
       -2 
      ] 
     } 
    }} 
]) 
+0

Super! Vielen Dank ;) – HVT7

Verwandte Themen