Mongoose / MongoDB:计算数组中的元素



我正在尝试使用 Mongoose 计算集合中数组中字符串的出现次数。 我的"架构"如下所示:

var ThingSchema = new Schema({
  tokens: [ String ]
});

我的目标是获取"事物"集合中的前 10 个"令牌",每个文档可以包含多个值。 例如:

var documentOne = {
    _id: ObjectId('50ff1299a6177ef9160007fa')
  , tokens: [ 'foo' ]
}
var documentTwo = {
    _id: ObjectId('50ff1299a6177ef9160007fb')
  , tokens: [ 'foo', 'bar' ]
}
var documentThree = {
    _id: ObjectId('50ff1299a6177ef9160007fc')
  , tokens: [ 'foo', 'bar', 'baz' ]
}
var documentFour = {
    _id: ObjectId('50ff1299a6177ef9160007fd')
  , tokens: [ 'foo', 'baz' ]
}

。会给我数据结果:

[ foo: 4, bar: 2 baz: 2 ]

我正在考虑使用MapReduce和Aggregation作为这个工具,但我不确定什么是最好的选择。

哈,我找到了解决方案。 MongoDB的aggregate框架允许我们在集合上执行一系列任务。 特别值得注意的是$unwind,它将文档中的数组分解为唯一的文档,因此它们可以被分组/集体计数。

MongooseJS在模型上非常容易地公开了这一点。 使用上面的示例,这如下所示:

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

在~200,000条记录的初步测试中,它明显比MapReduce快,因此可能扩展得更好,但这只是粗略一瞥。 扬子晚报.

相关内容

  • 没有找到相关文章

最新更新