哪个查询会更快? 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"
}
]
}
答案 0 :(得分:4)
如the documentation中所述,应尽可能使用$in
代替$or
。
但您也不需要使用$elemMatch
,因为您直接与单个字段匹配,因此您可以将查询简化为:
db.house.find(
{ 'persons.person_id':
{ $in:
[ ObjectId("570028671d41c8eaeb6c9ce8"),
ObjectId("570028681d41c8eaeb6c9e38")
]
}
})