确保MongoDB聚合中的查询顺序?

时间:2018-06-17 20:22:19

标签: mongodb indexing aggregation-framework

假设我有100M个记录(包含user_unique_idtransaction_id和其他一些字段),其中包含user_unique_idtransaction_id,其中{{1}我属于我(user_unique_id作为我的user_unique_id的记录),现在我想编写一个查询,在输入数组中我有一些10090)和transaction_id's是不存在,现在我的工作是取这10个。

现在,为了执行此查询,我可以做的是

处理。首先,我将使用user_unique_id索引在100M记录中搜索我的100个文档。因此,扫描的文档将仅等于100。然后我可以使用10查看该元素是否存在于我的90条记录中,如果没有,那么我将返回该记录。

流程b 。首先,我将使用$arrayElemAt来查找我的90条记录中是否存在该记录,如果不存在,那么我将搜索100M记录。

现在,如果我将执行$arrayElemAt,那么Process b索引是否会被利用,因为对于我们必须查看的每个文档transaction_id,所以我认为扫描的文档将是100M。< / p>

任何人都可以告诉我这两个步骤确保我将首先使用$arrayElemAt搜索我的100条记录,然后使用user_unique_id查看文档是否存在?因为当MongoDB本身执行query-optimization时,将如何做出最终决定?

第1步

$arrayElemAt

第2步

db.transactions.aggregate([
    {
        $match: {
            $and: [
                { /* Search In 100M record using user_unique_id */},
                { /* USe $arrayElemAt to look if that  record is present or not */},
            ]
        }
    }
]);

db.transactions.aggregate([ { $match: { { /* Search In 100M record using user_unique_id */}, } }, { $match: { { /* USe $arrayElemAt to look if that record is present or not */}, } } ]); 出现在交易中。

Indexes

1 个答案:

答案 0 :(得分:1)

根据您的信息,MongoDB应以同样的方式处理这两个查询(Step1Step2)。

我认为MongoDB会使用user_unique_id_1索引,因为它会更小(所以会更快)。

MongoDB首先按user_unique_id字段选择文档,然后检查其他条件。

MongoDB非常聪明,可以为查询执行选择最佳(最有效/最快)的计划,因此winning plan有时可能会根据集合和查询的详细信息而有所不同。

如果您想查看查询的winningPlan,请在{ explain: true }查询中添加aggregation选项。

示例:

db.transactions.aggregate([...], {explain: true});

查看explain documentation页面。