Во время моих переговоров с MongoDB я пришел к пониманию проблемы с индексами MongoDB. Проблема в том, что индексы MongoDB иногда не применяют двунаправленные границы для запроса. Вот один из выхода я столкнулся во время запросов к базе данных:Ограничения границ индекса MongoDB
Запрос:
db.user.find({transaction:{$elemMatch:{product:"mobile", firstTransaction:{$gte:ISODate("2015-01-01"), $lt:ISODate("2015-01-02")}}}}).hint("transaction.product_1_transaction.firstTransaction_1").explain()
Выход:
"cursor" : "BtreeCursor transaction.firstTransaction_1_transaction.product_1",
"isMultiKey" : true,
"n" : 622,
"nscannedObjects" : 350931,
"nscanned" : 6188185,
"nscannedObjectsAllPlans" : 350931,
"nscannedAllPlans" : 6188185,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 235851,
"nChunkSkips" : 0,
"millis" : 407579,
"indexBounds" : {
"transaction.firstTransaction" : [
[
true,
ISODate("2015-01-02T00:00:00Z")
]
],
"transaction.product" : [
[
"mobile",
"mobile"
]
]
},
Как вы можете видеть в приведенном выше примере для поля firstTransaction один конец связанный является true вместо даты, о которой я упоминал. Я обнаружил, что обходной путь для этого - функции min(), max(). Я пробовал те, но они, похоже, не работают со встроенным документом (транзакция представляет собой массив вспомогательного документа, который содержит такие поля, как firstTransaction, продукт и т. Д.). Я получаю следующее сообщение об ошибке:
Запрос:
db.user.find({transaction:{$elemMatch:{product:'mobile'}}}).min({transaction:{$elemMatch:{firstTransaction:ISODate("2015-01-01")}}}).max({transaction:{$elemMatch:{firstTransaction:ISODate("2015-01-02")}}})
Выход:
planner returned error: unable to find relevant index for max/min query
поле firstTransaction индексируется, хотя, как и продукт & их соединение индекса тоже. Я не знаю, что здесь происходит.
Образец документа:
{
_id: UUID (indexed by default),
name: string,
dob: ISODate,
addr: string,
createdAt: ISODate (indexed),
.
.
.,
transaction:[
{
firstTransaction: ISODate(indexed),
lastTransaction: ISODate(indexed),
amount: float,
product: string (indexed),
.
.
.
},...
],
other sub documents...
}
Было бы полезно увидеть ваш запрос, а не только результат 'explain' ... – mnemosyn