假设我有100M
个记录(包含user_unique_id
,transaction_id
和其他一些字段),其中包含user_unique_id
和transaction_id
,其中{{1}我属于我(user_unique_id作为我的user_unique_id的记录),现在我想编写一个查询,在输入数组中我有一些100
(90
)和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
答案 0 :(得分:1)
根据您的信息,MongoDB应以同样的方式处理这两个查询(Step1
和Step2
)。
我认为MongoDB会使用user_unique_id_1
索引,因为它会更小(所以会更快)。
MongoDB首先按user_unique_id
字段选择文档,然后检查其他条件。
MongoDB非常聪明,可以为查询执行选择最佳(最有效/最快)的计划,因此winning plan
有时可能会根据集合和查询的详细信息而有所不同。
如果您想查看查询的winningPlan
,请在{ explain: true }
查询中添加aggregation
选项。
示例:
db.transactions.aggregate([...], {explain: true});