MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongoDB-Abfrage zum Abrufen aus der verschachtelten Array-Sammlung

Sie benötigen $elemMatch und aggregieren .

db.users.aggregate([
    {
        $unwind: "$Sessions"
    },
    {
        $match: {
            "Sessions.Last_Login": {
                $gte: ISODate("2016-06-16T00:00:00.0Z"),
                $lt: ISODate("2016-06-17T00:00:00.0Z")
            }
        }
    },
    {
        $group: {
            _id: {
                _id: "$_id",
                First_Name: "$First_Name",
                Last_Name: "$Last_Name"
            },
            Sessions: {
                $push: "$Sessions"
            }
        }
    },
    {
        $project: {
            _id: "$_id._id",
            First_Name: "$_id.First_Name",
            Last_Name: "$_id.Last_Name",
            Sessions: "$Sessions"
        }
    }
])

Die Abfrage führt also diese Schritte aus:

  1. $unwind alle Sessions Elemente
  2. $match Dokumente innerhalb des Datumsbereichs
  3. $group Dokumente nach _id zusammenfassen , First_Name , Last_Name
  4. $project Dokumente wie das Originalformat aussehen

Ich habe einige Felder weggelassen, aber Sie können sie einfach in $group hinzufügen und $project Schritte. Und natürlich müssen Sie den Datumsbereich ändern.

Ich mache mir Sorgen um die Leistung dieser Abfrage in einer großen Sammlung. Vielleicht ist es besser, wenn Sie die erste Abfrage verwenden, die ich gegeben habe, und die gewünschten Sitzungen in Ihrem Code filtern.

Bearbeiten:

Wie @chridam sagte, funktioniert diese Abfrage nur, wenn Sie Last_Login ändern zu ISODate() , was empfohlen wird.

Änderung 2:

Aktualisieren der Abfrage zur Verwendung von aggregate und passen Sie die Anforderung an, nur Sessions abzurufen innerhalb des Datumsbereichs.

Dies ist die alte Version:

db.users.filter({
    'Sessions': {
        '$elemMatch': {
            'Last_Login': {
                '$gte': ISODate("2016-06-16T00:00:00.0Z"),
                '$lt': ISODate("2016-06-17T00:00:00.0Z")
            }
        }
    }
})