MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose / MongoDB :compter les éléments dans le tableau

Ah, j'ai trouvé la solution. aggregate de MongoDB framework nous permet d'exécuter une série de tâches sur une collection. Il convient de noter en particulier $unwind , qui décompose un tableau dans un document en documents uniques , donc ils peuvent être des groupes / comptés en masse .

MongooseJS expose cela de manière très accessible sur un modèle. En utilisant l'exemple ci-dessus, cela ressemble à ceci :

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

Il est nettement plus rapide que MapReduce dans les tests préliminaires sur environ 200 000 enregistrements, et donc probablement mieux mis à l'échelle, mais ce n'est qu'après un coup d'œil rapide. YMMV.