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

Преброяване на агрегацията на вложени обекти в MongoDB

Трябва да обработите $unwind когато работите с масиви и трябва да направите това три пъти:

 db.collection.aggregate([

     // Un-wind the array's to access filtering 
     { "$unwind": "$studies" },
     { "$unwind": "$studies.samples" },
     { "$unwind": "$studies.samples.formdata" },

     // Group results to obtain the matched count per key
     { "$group": {
         "_id": "$studies.samples.formdata.GT",
         "count": { "$sum": 1 }
     }}
 ])

В идеалния случай искате да филтрирате входа си. Евентуално направете това с $match преди и след $unwind се обработва и се използва $regex за съпоставяне на документи, където данните започват с "1".

 db.collection.aggregate([

     // Match first to exclude documents where this is not present in any array member
     { "$match": { "studies.samples.formdata.GT": /^1/ } },

     // Un-wind the array's to access filtering 
     { "$unwind": "$studies" },
     { "$unwind": "$studies.samples" },
     { "$unwind": "$studies.samples.formdata" },

     // Match to filter
     { "$match": { "studies.samples.formdata.GT": /^1/ } },

     // Group results to obtain the matched count per key
     { "$group": {
         "_id": {
              "_id": "$_id",
              "key": "$studies.samples.formdata.GT"
         },
         "count": { "$sum": 1 }
     }}
 ])

Обърнете внимание, че във всички случаи записите с префикс "dollar $" са "променливите", отнасящи се до свойствата на документа. Това са "стойности", за да използвате вход от дясната страна. „Клавишите“ от лявата страна трябва да бъдат посочени като обикновен низов ключ. Не може да се използва променлива за име на ключ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Отхвърлен анализатор на тялото?

  2. mongodb не можа да се свърже със сървъра

  3. MongoDB няма останало място на устройството с докер

  4. Mongo JSON документ -> JSON -> BSON

  5. Meteor:как да върна данни от полета в конкретен обект?