2016-05-10 9 views
2

ich eine Anfrage an MongoDB machenWie eine Reihe von Dokumenten auf zwei Dimensionen Array konvertieren

db.getCollection('user_actions').aggregate([ 
    {$match: { 
     type: 'play_started', 
     entity_id: {$ne: null} 
    }}, 
    {$group: { 
     _id: '$entity_id', 
     view_count: {$sum: 1} 
    }}, 
]) 

und eine Liste der Dokumente mit zwei Feldern bekommen:

enter image description here

Wie kann ich Holen Sie sich eine Liste von Listen mit zwei Elementen wie

[[entity_id, view_count], [entity_id, view_count], ...] 
+0

Bitte einige Beispieldokumente posten. – Saleem

Antwort

2

Eigentlich gibt es zwei verschiedene Möglichkeit, dies zu tun, abhängig von Ihrer MongoDB-Serverversion.

Der optimale Weg ist in MongoDB 3.2 mit den eckigen Klammern [] direkt neue Array-Felder in der $project Bühne zu erstellen. Dies gibt ein Array für jede Gruppe zurück. Die nächste Stufe ist die andere Stufe $group, in der Sie Ihr Dokument gruppieren und den Akkumulatoroperator $push verwenden, um ein zweidimensionales Array zurückzugeben.

db.getCollection('user_actions').aggregate([ 
    { "$match": { 
     "type": 'play_started', 
     "entity_id": { "$ne": null } 
    }}, 
    { "$group": { 
     "_id": "$entity_id", 
     "view_count": { "$sum": 1} 
    }}, 
    { "$project": { 
     "_id": 0, 
     "result": [ "$_id", "$view_count" ] 
    }}, 
    { "$group": { 
     "_id": null, 
     "result": { "$push": "$result" } 
    }} 
]) 

Von MongoDB 2.6 und vor 3.2 müssen Sie einen anderen Ansatz. Um Ihr Array zu erstellen, müssen Sie den Operator $map verwenden. Da das $map "Eingabe" -Feld in und Array aufgelöst werden muss, müssen Sie den Operator $literal verwenden, um einen literalen Array-Wert auf input zu setzen. Natürlich gibt der Operator $cond hier die "entity_id" oder "view_count" entsprechend dem "boolean-expression" zurück.

db.getCollection('user_actions').aggregate([ 
    { "$match": { 
     "type": 'play_started', 
     "entity_id": { "$ne": null } 
    }}, 
    { "$group": { 
     "_id": "$entity_id", 
     "view_count": { "$sum": 1} 
    }}, 
    { "$project": { 
     "_id": 0, 
     "result": { 
      "$map": { 
       "input": { "$literal": [ "A", "B"] }, 
       "as": "el", 
       "in": { 
        "$cond": [ 
         { "$eq": [ "$$el", "A" ] }, 
         "$_id", 
         "$view_count" 
        ] 
       } 
      } 
     } 
    }}, 
    { "$group": { 
     "_id": null, 
     "result": { "$push": "$result" } 
    }} 
]) 

Es ist erwähnenswert, dass dies auch in MongoDB 2.4 funktioniert. Wenn Sie MongoDB 2.2 ausführen, können Sie den undokumentierten Operator $const verwenden, der dasselbe tut.

Verwandte Themen