As the MongoDB Manual explains, it is possible to index a query with an
$or condition, but only if all branches of the $or are supported by indexes.
For example, MongoDB can use indexes for the following query, but only if there are two separate indexes supporting both the predicates on
{is:blocked: true} and {is_quarantined: true}:{ $query:
{ $or: [ { is_blocked: true },
{ is_quarantined: true }
] },
$orderby: { last_name: 1, first_name: 1, email: 1 }
}
You can also use indexes to avoid an in-memory or on-disk sort. If you provide an index that supports the predicates and the sort clause for all branches of the
$or, MongoDB can replace a SORT operation with a much more efficient SORT_MERGE.
To verify this, execute the following query to view the execution plan without supporting indexes.:
db.tenant_users.find({ $or: [ { is_blocked: true }, { is_quarantined: true } ] })
.sort({ last_name: 1, first_name: 1, email: 1 })
.explain()
Compare to the execution plan of the same query after creating supporting indexes:
db.tenant_users.createIndex({ is_blocked: 1, last_name: 1, first_name: 1, email: 1 });
db.tenant_users.createIndex({ is_quarantined: 1, last_name: 1, first_name: 1, email: 1 });
db.tenant_users.find({ $or: [ { is_blocked: true }, { is_quarantined: true } ] })
.sort({ last_name: 1, first_name: 1, email: 1 })
.explain()
Comments
Post a Comment