使用MongoDB的新聚合框架搜索和计算标记的有效方法?
我正在试验新的AF,以从Map/reduce迁移。我有数百万个这样的对象:使用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
{
_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调用转换为这个框架,有一次我在十分之一的时间内得到了相同的结果