/ / Как да се използват индекси в съвкупност - node.js, mongodb, mongoose, aggregation-framework

Как да използваме индексите в съвкупност - node.js, mongodb, mongoose, aggregation-framework

Създадох индекса с помощта на createIndex и след това се уверих в използването на ensureIndex

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 stages.

Поставянето на етап на съвпадение на $ $, следван от a$ сортирате сцената в началото на тръбопровода е логически равностойна на една заявка със сортиране и може да използва индекс. Когато е възможно, поставете оператори на мач $ в началото на тръбопровода.

Освен това е за предпочитане да се поставят $ skip и $ limit етапи възможно най-рано.

Ранно филтриране Ако операцията ви за агрегиране изисква само aподмножество от данните в колекция, използвайте мачовете $ match, $ limit и $ skip за да ограничите документите, които влизат в началото на тръбопровода. Когато се поставят в началото на тръбопровода, използват операции за съвпадение $ подходящи индекси за сканиране само на съвпадащи документи в колекция.

И накрая,

За комбиниран индекс, MongoDB може да използва индекса за поддържане на заявки индексите.