Mongodb。Or和索引

Mongodb。Or和索引,mongodb,Mongodb,我注意到,如果使用OR运算符和排序运算符,Mongodb 2.2似乎不使用索引。我不知道这是否与此有关 让我解释一下: 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("5124c7a1afaf46ffbd

我注意到,如果使用OR运算符和排序运算符,Mongodb 2.2似乎不使用索引。我不知道这是否与此有关

让我解释一下:

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",
好的,所以查询然后按发送日期排序使用BtreeCursor

db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).explain()
{
    "clauses" : [
        {
            "cursor" : "BtreeCursor to_id_1",
db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BasicCursor",
确定具有to_id或from_id的查询也使用BtreeCursor

db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).explain()
{
    "clauses" : [
        {
            "cursor" : "BtreeCursor to_id_1",
db.messages.find( {$or: [{'to_id':ObjectId("5124c7a1afaf46ffbd90b470")}, {'from_id':ObjectId("5124c7a1afaf46ffbd90b470")}]} ).sort({'sent_date':-1}).explain()
{
    "cursor" : "BasicCursor",
失败!具有to_id或from_id且排序的查询不使用索引。为什么?

我的问题是:

一直都是这样吗? 人们是如何绕过这个问题的?人们是否执行两个单独的查询并将结果粘在代码中?
这是一种不使用索引的排序,$or,是的,它一直是这样的:我相信这就是你要做的。是的,你需要进行两次查询,并在本地合并排序列表,直到它在2.6中得到解决。当我再次看时,实际上这次阅读时,我看到你已经找到了JIRA