Tôi nghĩ rằng một chỉ số thưa thớt là câu trả lời cho điều này, mặc dù bạn sẽ cần một chỉ mục cho từng trường. http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes
Chỉ mục thưa thớt sẽ giúp $ tồn tại: truy vấn đúng.
Thậm chí vẫn còn, nếu trường của bạn không thực sự thưa thớt (có nghĩa là nó chủ yếu được đặt), nó sẽ không giúp bạn nhiều.
Cập nhật Tôi đoán tôi đã sai. Dường như có sự cố mở (https://jira.mongodb.org/browse/SERVER-4187) vẫn tồn tại $ $ không sử dụng chỉ mục thưa thớt. Tuy nhiên, bạn có thể làm một cái gì đó như thế này với tìm và sắp xếp, mà hình như nó đúng cách sử dụng chỉ số thưa thớt:
db.ent.find({}).sort({a:1});
Dưới đây là một minh chứng đầy đủ về sự khác biệt, sử dụng giá trị mẫu của bạn:
> db.ent.insert({'a':5775, 'b':'b1'})
> db.ent.insert({'c':'its a c', 'b':'b2'})
> db.ent.insert({'a':7557, 'c':'its a c'})
> db.ent.ensureIndex({a:1},{sparse:true});
Lưu ý rằng find({}).sort({a:1})
sử dụng chỉ số (BtreeCursor):
> db.ent.find({}).sort({a:1}).explain();
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
Và find({a:{$exists:true}})
hiện một đầy đủ quét:
> db.ent.find({a:{$exists:true}}).explain();
{
"cursor" : "BasicCursor",
"nscanned" : 3,
"nscannedObjects" : 3,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
Có vẻ như bạn cũng có thể sử dụng .hint ({a: 1}) để buộc nó sử dụng chỉ mục.
> db.ent.find().hint({a:1}).explain();
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
xem: http://www.mongodb.org/display/DOCS/Using+Multikeys+to+Simulate+a+Large+Number+of+ Chỉ mục – Dewfy