2016-06-15 5 views
4
{ 
    "_id" : ObjectId("576155a6cd87b68f7e6e42c9"), 
    "First_Name" : "ok", 
    "Last_Name" : "jaao", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Last_Login" : "Wed, Jun 14, 2016 6:48 PM", 
      "Class" : "fb", 
      "ID" : "123" 
     }, 
     { 
      "Last_Login" : "Wed, Jun 15, 2016 6:48 PM", 
      "ID" : "111", 
      "Class" : "fb" 
     } 
    ], 
    "Count" : 2 
}, 
{ 
    "_id" : ObjectId("576155ccf6d8979e7e77df27"), 
    "First_Name" : "abc", 
    "Last_Name" : "xyz", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Last_Login" : "Wed, Jun 15, 2016 6:49 PM", 
      "Class" : "fb", 
      "ID" : "123" 
     } 
    ], 
    "Count" : 1 
} 

Dies ist meine JSON-Struktur. und ich möchte eine mongoDB-Abfrage, die jeden Benutzer abruft, der sich heute angemeldet hat, d. h. dessen Last_Login das heutige Datum hat.MongoDB Abfrage zum Abrufen von verschachtelten Array-Sammlung

Ich möchte meine Ausgabe als:

{ 
    "_id" : ObjectId("576155a6cd87b68f7e6e42c9"), 
    "First_Name" : "ok", 
    "Last_Name" : "jaao", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Last_Login" : "Wed, Jun 15, 2016 6:48 PM", 
      "ID" : "111", 
      "Class" : "fb" 
     } 
    ], 
    "Count" : 2 
}, 
{ 
    "_id" : ObjectId("576155ccf6d8979e7e77df27"), 
    "First_Name" : "abc", 
    "Last_Name" : "xyz", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Last_Login" : "Wed, Jun 15, 2016 6:49 PM", 
      "Class" : "fb", 
      "ID" : "123" 
     } 
    ], 
    "Count" : 1 
} 
+1

Daten gespeichert wie das wird komplexe Abfragen müssen die unwirksam sein kann. Sie können Ihr Schema so ändern, dass 'Last_Login' Daten gespeichert werden als' OSDate() ' – chridam

+0

Das Feld Last_Login enthält Daten im Format moment(). Format ('llll') von der Bibliothek moment.js. Muss ich es noch ändern? zu ISODate() ??? –

+0

Ja, es ist besser, Daten in MongoDB als richtige Date() -Typen zu speichern, anstatt sie als Strings im obigen Format zu speichern. – chridam

Antwort

1

Sie $elemMatch und aggregate benötigen.

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" 
     } 
    } 
]) 

So wird die Abfrage tun diese Schritte:

  1. $unwind alle Sessions Elemente
  2. $match Dokumente innerhalb des Datumsbereich
  3. $group zusammen Dokumente, die von _id, First_Name, Last_Name
  4. $project Dokumente zu lo ok wie das Original-Format

ich weggelassen einige Felder, aber man kann es leicht in $group und $project Schritte. Und natürlich müssen Sie den Datumsbereich ändern.

Ich bin besorgt über die Leistung dieser Abfrage in einer großen Sammlung. Vielleicht ist es besser, wenn Sie die erste Abfrage verwenden, die ich angegeben habe, und die gewünschten Sitzungen in Ihrem Code filtern.

Edit:

Wie @chridam sagte, diese Abfrage wird nur funktionieren, wenn Sie Last_Login-ISODate() ändern, was zu empfehlen ist.

Edit 2:

die Abfrage aktualisiert aggregate zu verwenden und die Anforderung entspricht nur Sessions innerhalb des Bereichs Datum holen.

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") 
      } 
     } 
    } 
}) 
+0

Nicht sicher, ob die Abfrage funktioniert, da das 'Last_Login'-Datum vom OP als String angegeben wird. – chridam

+0

@chridam Sicher, ich habe es nicht bemerkt. –

+0

es sagt ISODate() nicht definiert ... andere Alternativen ?? –

Verwandte Themen