MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Извлечете списък с елементи, като проверите множество стойности на атрибути в MongoDB в golang

Ще трябва да използвате рамката за агрегиране, където ще стартирате конвейер за агрегиране, който първо филтрира документите в колекцията въз основа на venueList идентификатори с помощта на $match оператор.

Вторият конвейер ще доведе до изравняване на venueList и сума масиви от поддокументи, за да могат данните в документите да бъдат обработени по-нататък по тръбопровода като денормализирани записи. $unwind операторът е полезен тук.

Допълнителен филтър, използващ $match е необходимо след отвиване, така че само документите, които искате да обедините, да бъдат допуснати в следващия конвейер.

Основният тръбопровод ще бъде $group етап на оператор, който агрегира филтрираните документи, за да създаде желаните суми, като използва оператора за акумулиране $sum . За желания резултат ще трябва да използвате тенарен оператор като $cond за създаване на независими полета за преброяване, тъй като това ще подаде броя документи към $sum израз в зависимост от стойността на името.

Събирайки всичко това, обмислете изпълнението на следния конвейер:

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

За използване с mGo можете да конвертирате горния конвейер, като използвате указанията в http://godoc.org/labix.org/v2/mgo#Collection.Pipe

За по-гъвкава и по-добре производителна алтернатива, която се изпълнява много по-бързо от горното и също така взема предвид неизвестни стойности за списъка със суми, стартирайте алтернативния конвейер, както следва

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. Как да получа db.currentOp() от C# драйвер - mongodb

  2. Самоподписана SSL връзка с помощта на PyMongo

  3. Spring HATEOAS RepresentationModel, Не могат да се задават връзки към свойства, защото няма настройка, няма изсъхване и не е част от конструктора на постоянство

  4. MongoDB:размерът на документа влияе ли върху производителността на заявките?

  5. mongodb:find() заявка в колекция