Вы используете драйвер Java правильно, но ваш вывод - что драйвер Java намного медленнее, чем консоль, - основан на неверном сравнении.Два кодовых блока вашего вопроса не эквивалентны.В варианте оболочки вы получаете курсор.В варианте Java вы извлекаете курсор и , когда вы перемещаетесь по содержимому этого курсора.
Для правильного сравнения между оболочкой Mongo и драйвером Java может потребоваться обход курсорав варианте оболочки, например:
db.getCollection('tracking_points').find({c: 8, d: 11,
t: {$gte: new Date("2018-08-10"), $lte: new Date("2018-09-10")}
}).forEach(
function(myDoc) {
// nothing here
}
)
Или пришлось бы убрать ходьбу над курсором из варианта Java, например:
collection.find(
and(
eq("c", clientId),
eq("d", unitId),
gte("t", start),
lte("t", end)
)
);
Оба они будут болеедействительные формы сравнения.Если вы запустите один из них, вы увидите, что прошедшее время на намного ближе друг к другу.Следующим вопросом может быть «почему для считывания этих данных требуется 30 секунд?».Если это так, то, что вы можете вернуть курсор на доли секунды, говорит нам, что проблема не в индексации , а скорее в том, что она связана с объемом данных , которые читаютсяпо запросу.
Чтобы изолировать, где возникает проблема, вы можете собрать время ожидания для следующего:
- читать данные, перебирать каждый документ, но не анализировать каждый документ
- читать данные и анализировать каждый документ при чтении
Если истекшее время для нет.2 не намного больше, чем истекшее время для нет.1, то вы знаете, что проблема не в разборе и, скорее всего, в передаче по сети.Если истекшее время для нет.2 намного больше, чем нет.1, тогда вы знаете, что проблема в разборе, и вы можете покопаться в вызове разбора, чтобы определить прошедшее время.Это могут быть ограниченные ресурсы на клиенте (ЦП и / или память) или субоптимальная реализация анализа.Я не могу сказать, как удалить, но использование описанного выше подхода для определения места, где находится проблема, по крайней мере, поможет вам направить ваше расследование.