/ / Wie man Indizes im Aggregat verwendet - node.js, mongodb, mongoose, aggregation-framework

Verwendung von Indizes im Aggregat - node.js, mongodb, mongoose, aggregation-framework

Ich habe den Index mit dem createIndex erstellt und stelle dann sicher, dass useIndex verwendet wird

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) } )

welche den Index erstellen:

"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"
}

und jetzt möchte ich diesen Index als Aggregat verwendenAbfrage. Ich weiß, dass der Index nicht funktioniert, wenn wir das Attribut $ project oder $ group aggregiert verwenden. Ich möchte diese Abfrage so umgestalten, dass sie die Indizes verwenden kann, sie aber nicht erstellen kann

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)
}])

wenn ich die Abfrage abfange wie

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

Dies ergibt das unerwartete Ergebnis

Bitte, wenn jemand die Aggregat-Abfrage mit Indizes für diese Abfrage verwenden kann, bitte helfen Sie mir

Antworten:

0 für die Antwort № 1

Laut MongoDB-Dokumentation:

Die Pipelineoperatoren $ match und $ sort können einen Index nutzen wenn sie am Anfang der Pipeline auftreten.

Also, wenn Sie können, sollten Sie Ihre $ Sortierstufe vor $ Projekt und $ Gruppenstufen setzen.

Platzieren einer $ match-Pipeline-Stufe, gefolgt von a$ sort stage am Anfang der Pipeline entspricht logisch einer einzelnen Abfrage mit einer Sortierung und kann einen Index verwenden. Platzieren Sie nach Möglichkeit $ match-Operatoren bei der Beginn der Pipeline.

Außerdem sollten die Stufen $ skip und $ limit so früh wie möglich platziert werden.

Frühe Filterung Wenn Ihre Aggregationsoperation nur a erfordertTeilmenge Verwenden Sie für die Daten in einer Sammlung die Phasen $ match, $ limit und $ skip um die Dokumente einzuschränken, die am Anfang der Pipeline eingegeben werden. Wenn sie am Anfang einer Pipeline platziert werden, verwenden $ match-Operationen geeignete Indizes, um nur die übereinstimmenden Dokumente in einer Sammlung zu scannen.

Und schlussendlich,

Bei einem zusammengesetzten Index kann MongoDB den Index zur Unterstützung von Abfragen verwenden die Indexpräfixe.