sql >> Databáze >  >> NoSQL >> MongoDB

dotaz mongoDB pro načítání z kolekce vnořených polí

Budete potřebovat $elemMatch a agregát .

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

Dotaz tedy provede tyto kroky:

  1. $unwind všechny Sessions prvky
  2. $match dokumenty v daném časovém období
  3. $group společně dokumenty podle _id , First_Name , Last_Name
  4. $project dokumenty, aby vypadaly jako v původním formátu

Některá pole jsem vynechal, ale můžete je snadno přidat do $group a $project kroky. A samozřejmě budete muset změnit časové období.

Mám obavy o výkon tohoto dotazu ve velké sbírce. Možná je lepší, když použijete první dotaz, který jsem zadal, a filtrujte relace, které chcete ve svém kódu.

Upravit:

Jak řekl @chridam, tento dotaz bude fungovat, pouze pokud změníte Last_Login na ISODate() , co se doporučuje.

Úprava 2:

Aktualizace dotazu tak, aby používal aggregate a odpovídat požadavku pouze načíst Sessions uvnitř časového období.

Toto je stará verze:

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



  1. Hledat a nahradit v Mongodb?

  2. Může Python zapisovat do databáze a Meteor reaktivně aktualizovat

  3. proč použití ORM s NoSql (jako MongoDB)

  4. Serializujte jednu třídu dvěma různými způsoby s Jacksonem