There are some questions 1, 2 talk about the MongoDB warning Query Targeting: Scanned Objects / Returned has gone above 1000
, however, my question is another case.
The schema of our document is
{
"_id" : ObjectId("abc"),
"key" : "key_1",
"val" : "1",
"created_at" : ISODate("2021-09-25T07:38:04.985Z"),
"a_has_sent" : false,
"b_has_sent" : false,
"updated_at" : ISODate("2021-09-25T07:38:04.985Z")
}
The indexes of this collections are
{
"key" : {
"updated_at" : 1
},
"name" : "updated_at_1",
"expireAfterSeconds" : 5184000,
"background" : true
},
{
"key" : {
"updated_at" : 1,
"a_has_sent" : 1,
"b_has_sent" : 1
},
"name" : "updated_at_1_a_has_sent_1_b_has_sent_1",
"background" : true
}
The total number of documents after 2021-09-24
is over 600000, and the distinct value of key
is 5.
The above waning caused by the query
db.collectionname.find({ "updated_at": { "$gte": ISODate("2021-09-24")}, "$or": [{ "a_has_sent": false }, {"b_has_sent": false}], "key": "key_1"})
Our server sends one document to a
and b
simutinously with batch size 2000. After sending to a
successfully, mark a_has_sent
to true
. The same logic to b
. As sending process goes on, the number of documents with a_has_sent: false
reduce. And the above warning comes up.
After checking the explain
result of this query, the index named updated_at_1
is used rather than updated_at_1_a_has_sent_1_b_has_sent_1
.
What we had tried.
- We add another new index
{"updated_at": 1, "key": 1}
, and expect this query could use the new index to reduce the number of scanned documents. Unfortunately, we failed. The index namedupdated_at_1
is still used. - We try to replace
find
withaggregate
aggregate([{"$match": { "updated_at": { "$gte": ISODate("2021-09-24") }, "$or": [{ "a_has_sent": false }, { "b_has_sent": false}], "key": "key_1"}}])
. Unfortunately, The index namedupdated_at_1
is still used.
We want to know how to eliminate this warning Scanned Objects / Returned has gone above 1000
?
Mongo 4.0 is used in our case.