MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zapytanie mongoDB do pobrania z zagnieżdżonej kolekcji tablic

Będziesz potrzebować $elemMatch i agregacja .

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

Zapytanie wykona te kroki:

  1. $unwind wszystkie Sessions elementy
  2. $match dokumenty w zakresie dat
  3. $group razem dokumenty według _id , First_Name , Last_Name
  4. $project dokumenty, aby wyglądały jak oryginalny format

Pominąłem niektóre pola, ale możesz je łatwo dodać w $group i $project kroki. I oczywiście musisz zmienić zakres dat.

Niepokoi mnie wydajność tego zapytania w dużej kolekcji. Może lepiej, jeśli użyjesz pierwszego zapytania, które podałem i odfiltrujesz sesje, które chcesz w swoim kodzie.

Edytuj:

Jak powiedział @chridam, to zapytanie będzie działać tylko wtedy, gdy zmienisz Last_Login do ISODate() , co jest zalecane.

Edytuj 2:

Aktualizowanie zapytania tak, aby używało aggregate i dopasuj żądanie pobierania tylko Sessions w zakresie dat.

To jest stara wersja:

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Korzystanie z CouchDb na telefonie z Androidem i mongodb po stronie serwera

  2. połączenie mongoengine i wiele baz danych

  3. MongoDB i CodeIgniter:Wybierz, gdzie istnieje pole

  4. $ odpowiednik push dla mapy w mongo

  5. Zmień domyślny rozmiar puli połączeń Mongo w spring-boot