我使用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阶段之前进行$ sort阶段。
在开始时放置$ match管道阶段,然后是$ sort阶段 管道在逻辑上等同于具有排序的单个查询 并且可以使用索引。如果可能,将$ match运算符放在 管道的开始。
此外,最好尽早放置$ skip和$ limit阶段。
早期过滤 如果您的聚合操作只需要一个子集 对于集合中的数据,请使用$ match,$ limit和$ skip阶段 限制在管道开头输入的文档。 当放置在管道的开头时,$ match操作使用 合适的索引只扫描集合中的匹配文档。
最后,
对于复合索引,MongoDB可以使用索引来支持查询 索引前缀。