sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongoose / MongoDB:tæl elementer i array

Aha, jeg har fundet løsningen. MongoDB's aggregate rammer giver os mulighed for at udføre en række opgaver på en samling. Af særlig betydning er $unwind , som opdeler et array i et dokument i unikke dokumenter , så de kan være grupper / tælles massevis .

MongooseJS eksponerer dette meget tilgængeligt på en model. Ved at bruge eksemplet ovenfor ser dette ud som følger:

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

Det er mærkbart hurtigere end MapReduce i foreløbige tests på tværs af ~200.000 poster, og skalerer derfor sandsynligvis bedre, men dette er kun efter et overfladisk blik. YMMV.




  1. 3 måder at returnere en tilfældig prøve af dokumenter fra en MongoDB-samling

  2. Bulk upsert i MongoDB ved hjælp af mongoose

  3. Pymongo forHver formatering

  4. Spring Data MongoDB - Annotation @CreatedDate virker ikke, mens du bruger med tilpasset Id-felt