sql >> Databasteknik >  >> NoSQL >> MongoDB

mongoDB-fråga för att hämta från kapslad arraysamling

Du behöver $elemMatch och aggregat .

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

Så frågan kommer att utföra dessa steg:

  1. $unwind alla Sessions element
  2. $match dokument inom datumintervallet
  3. $group tillsammans dokument med _id , First_Name , Last_Name
  4. $project dokument för att se ut som originalformatet

Jag har utelämnat några fält, men du kan enkelt lägga till det i $group och $project steg. Och naturligtvis måste du ändra datumintervallet.

Jag är oroad över resultatet av den här frågan i en stor samling. Kanske är bättre om du använder den första frågan jag gav och filtrerar de sessioner du vill ha i din kod.

Redigera:

Som @chridam sa, den här frågan fungerar bara om du ändrar Last_Login till ISODate() , vad som rekommenderas.

Redigera 2:

Uppdaterar frågan för att använda aggregate och matcha begäran om endast hämta Sessions inom datumintervallet.

Det här är den gamla versionen:

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



  1. Diff() mellan två samlingar i MongoDB

  2. Hur man använder GridFS för att lagra bilder med Node.js och Mongoose

  3. Lyssna på återanslutningshändelser i MongoDB-drivrutinen

  4. MongoDB Count() vs. Aggregation