sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose/MongoDB:contar elementos en matriz

Ajá, he encontrado la solución. aggregate de MongoDB framework nos permite ejecutar una serie de tareas sobre una colección. De particular interés es $unwind , que divide una matriz en un documento en documentos únicos , por lo que pueden ser grupos / contados en masa .

MongooseJS expone esto de manera muy accesible en un modelo. Usando el ejemplo anterior, esto se ve de la siguiente manera:

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

Es notablemente más rápido que MapReduce en pruebas preliminares en aproximadamente 200 000 registros y, por lo tanto, es probable que se escale mejor, pero esto es solo después de un vistazo rápido. YMMV.