MongoDB使用聚合功能选择子文档

MongoDB使用聚合功能选择子文档,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个mongo DB集合,看起来像这样: { { _id: objectId('aabbccddeeff'), objectName: 'MyFirstObject', objectLength: 0xDEADBEEF, objectSource: 'Source1', accessCounter: { 'firstLocationCode' : 283

我有一个mongo DB集合,看起来像这样:

{
    {
        _id: objectId('aabbccddeeff'),
        objectName: 'MyFirstObject',
        objectLength: 0xDEADBEEF,
        objectSource: 'Source1',
        accessCounter: {
                          'firstLocationCode' : 283, 
                          'secondLocationCode' : 543,
                          'ThirdLocationCode' : 564,
                          'FourthLocationCode' : 12,
                       }
    }
    ...
}
现在,假设这不是集合中的唯一记录,并且大多数/所有文档都包含accessCounter子文档/字段,我将如何选择从特定位置访问最多的x个文档

示例“查询”类似于:

“从myCollection中选择accessCounter.firstLocationCode最高的前10个文档”

因此,示例结果将是accessCounter所在的X个文档。最大的将是数据库


感谢您抽出时间阅读我的问题

不需要聚合,这是一个基本查询:

db.collection.find().sort({"accessCounter.firstLocation":-1}).limit(10)
为了加快速度,您应该首先在accessCounter上创建子文档索引:

db.collection.ensureIndex({'accessCounter':-1})
假设您希望对所有位置执行相同的查询。如果您只想查询firstLocation,请在
accessCounter.firstLocation
上创建索引

如果您只需要
accessCounter
值,则可以通过将其设置为所谓的覆盖查询来进一步加快查询速度,该查询返回的值来自索引本身。例如,当对子文档进行索引并查询top
secondLocation
s时,您应该能够使用以下内容执行覆盖查询:

db.collection.find({},{_id:0,"accessCounter.secondLocation":1})
.sort("accessCounter.secondLocation":-1).limit(10)
这将转换为“获取所有文档({}),不要像默认情况下那样返回
\u id
字段(“\u id:0”),只获取“accessCounter.secondLocation”字段('accessCounter.secondLocation:1')。按降序对返回的值进行排序,并给出前十个。”