使用MongoDB的新聚合框架搜索和计算标记的有效方法?

使用MongoDB的新聚合框架搜索和计算标记的有效方法?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在试验新的AF,以从Map/reduce迁移。我有数百万个这样的对象: { _id: ObjectID, owner: 1, tags: [ {text: "dog", score: 5}, {text: "cat", score: 3}, {text: "hamster", score:1}] } { _id: ObjectID, owner: 2, tags: [ {text: "cat", score: 8}, {text: "fish

我正在试验新的AF,以从Map/reduce迁移。我有数百万个这样的对象:

{
 _id: ObjectID,
 owner: 1,
 tags: [
   {text: "dog", score: 5}, 
   {text: "cat", score: 3}, 
   {text: "hamster", score:1}]
}

{
 _id: ObjectID,
 owner: 2,
 tags: [
   {text: "cat", score: 8}, 
   {text: "fish", score: 4}]
}
我想做一个报告,记录猫和鱼的所有匹配,主人是X

到目前为止,我的管道假设输入标记[cat,fish]看起来像:

{
  $match: { owner: X, $in: {"tags.text": ["cat", "fish"]}}
}, {
  $project: {text: "$tags.text"},
}, {
  $unwind: "$text",
}, {
  $match: {"text": {$in: {"tags": ["cat", "fish"]}}
}, {
  $group: {"_id": "$text", "total: {"$sum": 1}}
}
第一个$match是将范围缩小到所有这些百万对象的子集,因为我在owner和tags.txt上有一个索引

这个管道可以很好地处理少量的标签,但是我需要能够传入100-1000个标签并快速得到结果。看起来,在下一个匹配步骤中,将所有标签投影出来并展开,只过滤掉90%的标签,这肯定是低效的


有没有更有效的方法?也许重新安排管道步骤

对我来说这看起来不错,除了一些打字错误和$in操作符在每个$match管道操作中的用法可能应该是:

{ $match:{owner:X,tags.text:{$in:[cat,fish]} }, { $project:{text:$tags.text} }, { $unwind:$text }, { $match:{text:{$in:[cat,fish]} }, { $group:{u id:$text,总计:{$sum:1} }
实际上,您希望尽可能早地在管道中使用$match,以限制管道中稍后处理的文档数量。所有者和特定标记的匹配实现了这一点。您还需要确保$match(相当于.find)使用适当的索引

对我来说这看起来不错,除了一些打字错误和$in操作符在每个$match管道操作中的用法可能应该是:

{ $match:{owner:X,tags.text:{$in:[cat,fish]} }, { $project:{text:$tags.text} }, { $unwind:$text }, { $match:{text:{$in:[cat,fish]} }, { $group:{u id:$text,总计:{$sum:1} }
实际上,您希望尽可能早地在管道中使用$match,以限制管道中稍后处理的文档数量。所有者和特定标记的匹配实现了这一点。您还需要确保$match(相当于.find)使用适当的索引

顺便说一句,我已经将一些简单的MapReduce调用转换为这个框架,有一次我在十分之一的时间内得到了相同的结果。顺便说一句,我已经将一些简单的MapReduce调用转换为这个框架,有一次我在十分之一的时间内得到了相同的结果