Я использую Node.js и его собственный драйвер MongoDB. Я не уверен, какой из двух методов эффективен для проверки соответствия хотя бы одной записи критериям моего запроса. Обратите внимание: мне не нужны никакие поля этой записи, если они существуют.
const query = {
status: 'running',
'data.srId': 'certainValue'
};
data.srId индексируется.
collection.findOne(query, {id: 1}) против collection.countDocuments(query, {limit: 1})
Какой из двух будет лучше для моего варианта использования? Если есть что-то лучше этих двух, предложите.
Спасибо.
@jQueeny, в 90% случаев они уникальны, но не всегда.
findOne — это просто оболочка для find(query).limit(1). С индексом по data.srIdexecutionTimeMillis и executionTimeMillisEstimate по 1 миллиону документов для меня по вашему запросу было 0. Если бы data.srId был уникальным, вам бы не понадобился limit(1). Индекс уже оптимизирует ваш запрос. Использование find(query).limit(1) будет практически мгновенным.





countDocuments(), как правило, будет более эффективным.
Для получения более подробной информации используйте функцию .explain() для сравнения executionStats и executionTimeMillis.
const explanation = await collection.countDocuments(query, { limit: 1 }).explain();
console.info(explanation);
Вы можете использовать агрегатную функцию.
const pipeline = [
{ $match: {
status: 'running',
'data.srId': 'certainValue'
}},
{ $limit: 1 }
];
const aggregationResult = await collection.aggregate(pipeline).toArray();
if (aggregationResult.length > 0) {
console.info('At least one record matching the query.');
} else {
console.info('No records matching the query.');
}
Теперь, когда я вижу документацию, countDocuments() завершает следующую операцию агрегации и возвращает только значение n: db.collection.aggregate([ { $match: <query> }, { $group: { _id: null, n: { $sum: 1 } } } ])
Являются ли ценности
data.srIdуникальными?