sql >> Database >  >> NoSQL >> MongoDB

Mongoose / MongoDB:tel elementen in array

Aha, ik heb de oplossing gevonden. MongoDB's aggregate framework stelt ons in staat om een ​​reeks taken op een collectie uit te voeren. Van bijzonder belang is $unwind , die een array in een document opsplitst in unieke documenten , zodat ze kunnen worden groepen / geteld en masse .

MongooseJS legt dit heel toegankelijk op een model bloot. Aan de hand van het bovenstaande voorbeeld ziet dit er als volgt uit:

Thing.aggregate([
    { $match: { /* Query can go here, if you want to filter results. */ } } 
  , { $project: { tokens: 1 } } /* select the tokens field as something we want to "send" to the next command in the chain */
  , { $unwind: '$tokens' } /* this converts arrays into unique documents for counting */
  , { $group: { /* execute 'grouping' */
          _id: { token: '$tokens' } /* using the 'token' value as the _id */
        , count: { $sum: 1 } /* create a sum value */
      }
    }
], function(err, topTopics) {
  console.log(topTopics);
  // [ foo: 4, bar: 2 baz: 2 ]
});

Het is merkbaar sneller dan MapReduce in voorlopige tests over ~200.000 records, en schaalt dus waarschijnlijk beter, maar dit is pas na een vluchtige blik. YMMV.




  1. MongoDB:een document vinden op een id in een genest document

  2. MeteorJS - Afbeeldingen (FS.collection) koppelen aan hun relevante document in de MongoDB-collectie

  3. Installeer CouchDB op Debian 9

  4. Mongo filterarray van array van array