sql >> Database teknologi >  >> NoSQL >> MongoDB

mongoDB-forespørgsel til hentning fra indlejret array-samling

Du skal bruge $elemMatch og 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å forespørgslen vil udføre disse trin:

  1. $unwind alle Sessions elementer
  2. $match dokumenter inden for datointervallet
  3. $group sammen dokumenter efter _id , First_Name , Last_Name
  4. $project dokumenter til at ligne det originale format

Jeg har udeladt nogle felter, men du kan nemt tilføje det i $group og $project trin. Og selvfølgelig skal du ændre datointervallet.

Jeg er bekymret over effektiviteten af ​​denne forespørgsel i en stor samling. Måske er det bedre, hvis du bruger den første forespørgsel, jeg gav, og filtrerer de sessioner, du ønsker i din kode.

Rediger:

Som @chridam sagde, vil denne forespørgsel kun fungere, hvis du ændrer Last_Login til ISODate() , hvad der anbefales.

Rediger 2:

Opdatering af forespørgslen til at bruge aggregate og match anmodningen om kun at hente Sessions inden for datointervallet.

Dette er den gamle version:

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



  1. Sådan finder du MongoDB feltnavn på vilkårlig dybde

  2. findAll mislykkes, efter at spillemorphia er geninitialiseret

  3. MongoDB $minut

  4. Hvordan opretter man forbindelse til MongoDB 3.2 i Java med brugernavn og adgangskode?