/ / Як використовувати індекси в сукупності - node.js, mongodb, мангуста, агрегація-фреймворк

Як використовувати індекси в сукупності - node.js, mongodb, mongoose, агрегація-framework

Я створив індекс за допомогою createIndex, а потім переконався в застосуванні secureIndex

db.getCollection("artists").createIndex( { featured : NumberInt(-1), physicalCount : NumberInt(-1),digitalCount : NumberInt(-1),createdAt: NumberInt(-1) } )

db.getCollection("artists").ensureIndex( { featured : NumberInt(-1), physicalCount : NumberInt(-1),digitalCount : NumberInt(-1),createdAt: NumberInt(-1) } )

які створюють індекс:

"8" : {
"v" : 1,
"key" : {
"featured" : -1,
"physicalCount" : -1,
"digitalCount" : -1,
"createdAt" : -1
},
"name" : "featured_-1_physicalCount_-1_digitalCount_-1_createdAt_-1",
"ns" : "global-rockstar.artists"
}

і тепер я хочу використовувати цей індекс у сукупностізапит. Я знаю, що індекс не працює, коли ми використовуємо атрибут $ project або $ group у сукупності. Я хочу змінити цей запит, щоб він міг використовувати індекси, але не зміг його створити

db.getCollection("artists").aggregate([{
$match: query <- initially it is {}
}, {
$project: {
_id: 1,
name: 1,
genres_music: 1,
slug: 1,
country: 1,
featured: 1,
picture: 1,
fans: 1,
fans_a: 1,
credits: 1,
totalPlays: 1,
createdAt: 1,
fanCount: 1,
physicalCount: 1,
digitalCount: 1,
matches: {
$add: [{
$cond: [{
$or: [{
$eq: ["$featured", true]
}, {
$eq: ["$featured", "on"]
}]
},
3, 0
]
}, {
$size: {
$setIntersection: ["$genres_music", usergenres]
}
}]
}
}
}, {
$sort: {
matches: -1,
physicalCount : -1,
digitalCount : -1,
createdAt: -1
}
}, {
$skip: pageSize * page  <---- pageSize- 15 , page= 0
}, {
$limit: parseFloat(pageSize)
}])

коли я виконую запит, як

db.getCollection("artists").find({}).sort({
//"featured" : -1,
"physicalCount" : -1,
"digitalCount" : -1,
"createdAt" : -1
})

це дає несподіваний результат

Будь ласка, якщо хтось знає, як використовувати сукупний запит з індексами для цього запиту, будь ласка, допоможіть мені

Відповіді:

0 для відповіді № 1

Відповідно до документації MongoDB:

Оператори трубопроводів $ match та $ sort можуть скористатися індексом коли вони трапляються на початку трубопроводу.

Тож якщо ви можете, слід поставити свій етап сортування $ перед етапами $ project та $ group.

Розміщення етапу трубопроводу $ match з наступним a$ сортування на початку конвеєра логічно еквівалентно одному запиту з сортуванням і може використовувати індекс. Коли це можливо, розмістіть операторів $ match у початок трубопроводу.

Крім того, бажано розміщувати $ skip та $ limit стадії якомога раніше.

Рання фільтрація Якщо ваша операція агрегації вимагає лише апідмножина даних у колекції, використовуйте стадії $ match, $ limit та $ skip обмежити документи, які вводяться на початку трубопроводу. Якщо розміщуватись на початку трубопроводу, використовуються операції $ match відповідні індекси для сканування лише відповідних документів у колекції.

І, нарешті,

Для складеного індексу MongoDB може використовувати індекс для підтримки запитів на індексні префікси.