Mongodb更快$ $或$或?

时间:2016-04-03 11:34:33

标签: django mongodb mongoengine

哪个查询会更快? ObjectId列表的Len可以超过2个。

db.house.find(
    { persons:
        { $elemMatch:
            { person_id:
                { $in:
                    [ ObjectId("570028671d41c8eaeb6c9ce8"), 
                      ObjectId("570028681d41c8eaeb6c9e38")
                    ]
                 }
             }
         }
     })

db.house.find(
    { $or:
        [{ persons:
            {$elemMatch:  
                {person_id:ObjectId("570028671d41c8eaeb6c9ce8")}}
         }, 
         {persons:{$elemMatch:              
                {person_id:ObjectId("570028681d41c8eaeb6c9e38")}}
         }]
    })

我有以下索引:people,persons.person_id。我从Django(mongoengine)那里询问是否重要。目前我的数据库中有大约10万个房屋和2k人。 众议院文件是这样的:

{
    "_id" : ObjectId("570031aa1d41c8ed54393b19"),
    "persons" : [
        {
            "person_id" : ObjectId("570028671d41c8eaeb6c9dff"),
            "t" : "150 t"
        },
        {
            "person_id" : ObjectId("5700312d1d41c8ed54393b05"),
            "t" : "1 g"
        },
        {
            "person_id" : ObjectId("5700312d1d41c8ed54393b06"),
            "t" : "70 y"
        }
    ]
}

1 个答案:

答案 0 :(得分:4)

the documentation中所述,应尽可能使用$in代替$or

但您也不需要使用$elemMatch,因为您直接与单个字段匹配,因此您可以将查询简化为:

db.house.find(
    { 'persons.person_id':
        { $in:
            [ ObjectId("570028671d41c8eaeb6c9ce8"), 
              ObjectId("570028681d41c8eaeb6c9e38")
            ]
        }
    })