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

Pobierz listę przedmiotów, sprawdzając wiele wartości atrybutów w MongoDB w golang

Musisz użyć struktury agregacji, w której uruchomisz potok agregacji, który najpierw filtruje dokumenty w kolekcji na podstawie venueList identyfikatory przy użyciu $match operator.

Drugi potok pociąga za sobą spłaszczenie venueList i suma tablice poddokumentów w celu dalszego przetwarzania danych w dokumentach jako zdenormalizowane wpisy. $unwind operator jest tutaj przydatny.

Kolejny filtr przy użyciu $match jest konieczne po rozwinięciu, aby tylko dokumenty, które chcesz zagregować, są przepuszczane do następnego potoku.

Głównym rurociągiem byłby $grupa etap operatora, który agreguje przefiltrowane dokumenty, aby utworzyć żądane sumy za pomocą operatora akumulatora $sum . Aby uzyskać pożądany wynik, musiałbyś użyć operatora dziesiętnego, takiego jak $cond aby utworzyć niezależne pola zliczania, ponieważ przekaże to liczbę dokumentów do $sum wyrażenie w zależności od wartości nazwy.

Podsumowując, rozważ uruchomienie następującego potoku:

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    {
        "$group": {
            "_id": null,
            "linux": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "linux" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            },
            "ubuntu": {
                "$sum": {
                    "$cond": [ 
                        { "$eq": [ "$venueList.sum.name", "ubuntu" ] }, 
                        "$venueList.sum.value", 0 
                    ]
                }
            }
        }
    }
])

Do użytku z mGo możesz przekonwertować powyższy potok, korzystając ze wskazówek w http://godoc.org/labix.org/v2/mgo#Collection.Pipe

Aby uzyskać bardziej elastyczną i wydajniejszą alternatywę, która działa znacznie szybciej niż powyższe, a także uwzględnia nieznane wartości listy sum, uruchom alternatywny potok w następujący sposób

db.collection.aggregate([
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList" },
    { "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
    { "$unwind": "$venueList.sum" },    
    { 
        "$group": {
            "_id": "$venueList.sum.name",
            "count": { "$sum": "$venueList.sum.value" }
        }
    },
    { 
        "$group": {
            "_id": null,
            "counts": {
                "$push": {
                    "name": "$_id",
                    "count": "$count"
                }
            }
        }
    }
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak liczyć ilość dokumentów w kolekcji MongoDB w ramach Node?

  2. MongoDB z Mongoid w Rails — indeksowanie geoprzestrzenne

  3. mongodb łączy się za pomocą php

  4. 10 pytań, które należy zadać (i odpowiedzieć) podczas hostowania MongoDB na AWS

  5. Instancja Mongoose .save() nie działa