如何在聚合中使用索引

时间:2015-10-28 15:30:03

标签: 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
    })

这给出了意想不到的结果

如果有人知道如何使用带有此查询的索引的聚合查询,请帮助我

1 个答案:

答案 0 :(得分:1)

根据MongoDB文档:

  

$ match和$ sort管道运算符可以利用索引   当它们出现在管道的开头时。

所以,如果可以,你应该在$ project和$ group阶段之前进行$ sort阶段。

  

在开始时放置$ match管道阶段,然后是$ sort阶段   管道在逻辑上等同于具有排序的单个查询   并且可以使用索引。如果可能,将$ match运算符放在   管道的开始。

此外,最好尽早放置$ skip和$ limit阶段。

  

早期过滤   如果您的聚合操作只需要一个子集   对于集合中的数据,请使用$ match,$ limit和$ skip阶段   限制在管道开头输入的文档。   当放置在管道的开头时,$ match操作使用   合适的索引只扫描集合中的匹配文档。

最后,

  

对于复合索引,MongoDB可以使用索引来支持查询   索引前缀。