MongoDB的。或者索引

时间:2013-04-29 16:53:13

标签: mongodb

我注意到如果使用OR运算符和SORT运算符,Mongodb 2.2似乎不会使用索引。我想知道这个JIRA是否与它有关。

让我解释一下:

db.messages.ensureIndex({ 'to_id':1, 'sent_date':-1});
db.messages.ensureIndex({ 'from_id':1, 'sent_date':-1});

好的,我们在邮件集合上有索引。

 db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BtreeCursor to_id_1_sent_date_-1",

db.messages.find( {$or: [{'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BtreeCursor from_id_1_sent_date_-1",

确定如此查询然后按sent_date排序使用BtreeCursor。

db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).explain()
{
    "clauses" : [
        {
            "cursor" : "BtreeCursor to_id_1",

使用to_id或from_id的查询也可以使用BtreeCursor。

db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BasicCursor",

FAIL!带有to_id或from_id的查询和排序不使用索引。为什么呢?

我的问题:

  • 总是这样吗?
  • 人们对此做了什么 - 人们是否会执行2个单独的查询并将结果粘合在一起?

0 个答案:

没有答案