2017-05-18 2 views
0

Lasst uns sagen, dass ich eine Datenbank Sammlung users in mongodb genannt und die Dokumente wie folgt aussehen:ein Ergebnis der Unterlagen Get in Arrays in mongodb befindet

[{ 
    _id: 'userId1' 
    actions: [{ 
    name: 'SingUp', 
    data: '...', 
    time: '1' 
    }, { 
    name: 'CreatePost', 
    data: '...', 
    time: '4' 
    }] 
}, { 
    _id: 'userId2' 
    actions: [{ 
    name: 'SingUp', 
    data: '...', 
    time: '2' 
    }, { 
    name: 'CreatePost', 
    data: '...', 
    time: '3' 
    }, { 
    name: 'CreatePost', 
    data: '...', 
    time: '5' 
    }] 
}] 

Was wäre der effizienteste Weg sein, nur zu erhalten die Aktionsdokumente mit dem Namen CreatePost, alle nach Zeit sortiert? I.e. dies ist das Ergebnis I will:

[{ 
    name: 'CreatePost', 
    data: '...', 
    time: '3' 
}, { 
    name: 'CreatePost', 
    data: '...', 
    time: '4' 
}, { 
    name: 'CreatePost', 
    data: '...', 
    time: '5' 
}] 
+0

Es wäre Am effizientesten ist es, eine $ -Filteroperation in einer $ -Projektstufe als Aggregationsoperation zu verwenden. Sie können das innere Array jedoch nicht "sortieren", ohne zu einem "$ unwind" zu führen, wodurch die Effizienz erheblich sinkt. Wenn Sie natürlich akzeptieren können, dass das Array immer mit jeder Schreiboperation sortiert wird und nicht neu geordnet werden muss, wird der Ansatz "$ filter" praktikabel. Daher ist es am effizientesten, das Array in einem geordneten Zustand zu halten, anstatt zu versuchen, das zurückgegebene Ergebnis zu ändern. –

+0

Ich kann davon ausgehen, dass jedes Array sortiert ist, aber es kann gemischte Sortierung zwischen Arrays wie im obigen Beispiel geben, wo das erste und letzte Element des Ergebnisses im zweiten Dokument ist und das mittlere Element des Ergebnisses im ersten Dokument ist. –

Antwort

1

eine schnelle Lösung ist $unwind, Dokumente herauszufiltern, zu verwenden, um mit $match und schließlich sortieren $sort wie folgt aus:

db.users.aggregate([ 
    {$unwind: "$actions"}, 
    {$match: {"actions.name": "CreatePost"}}, 
    {$project: {"name": "$actions.name", "data": "$actions.data", "time": "$actions.time"}}, 
    {$sort: {"time": 1}} 
]) 
+0

Danke das funktioniert gut. Nur ein Kommentar: Um das von mir angegebene Ergebnis zu erhalten, sollte die Sortierung 1 und nicht -1 sein. Wissen Sie etwas über die Leistung für diese Lösung? –

+1

@LudwigMagnusson der '$ unwind'-Operator kann ziemlich expansiv sein, eine andere Lösung wäre es,' $ filter' in einer '$ project'-Phase zu verwenden, aber ich bin mir nicht sicher über den Leistungsunterschied zwischen diesen beiden Optionen – felix

Verwandte Themen