MongoDB选择具有聚合功能的子文档

时间:2014-10-23 22:29:06

标签: mongodb aggregation-framework

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

{
    {
        _id: objectId('aabbccddeeff'),
        objectName: 'MyFirstObject',
        objectLength: 0xDEADBEEF,
        objectSource: 'Source1',
        accessCounter: {
                          'firstLocationCode' : 283, 
                          'secondLocationCode' : 543,
                          'ThirdLocationCode' : 564,
                          'FourthLocationCode' : 12,
                       }
    }
    ...
}

现在,假设这不是集合中的唯一记录,并且大多数/所有文档都包含accessCounter子文档/字段,我将如何选择x个第一个文档,其中我从特定位置访问最多

示例“查询”将类似于:

“从myCollection中选择前10个文件,其中accessCounter.firstLocationCode最高”

所以一个示例结果将是X文档所在的accessCounter。将是最好的是数据库。

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

1 个答案:

答案 0 :(得分:1)

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

db.collection.find().sort({"accessCounter.firstLocation":-1}).limit(10)

为了加快速度,首先应在accessCounter上创建一个子文档索引:

db.collection.ensureIndex({'accessCounter':-1})

假设您要对所有位置执行相同的查询。如果您只想查询firstLocation,请在accessCounter.firstLocation上创建索引。

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

db.collection.find({},{_id:0,"accessCounter.secondLocation":1})
.sort("accessCounter.secondLocation":-1).limit(10)

转换为“获取所有文档('{}'),不要像默认情况下那样返回_id字段('_id:0'),只获取'accessCounter.secondLocation'字段('accessCounter.secondLocation:1')。按降序对返回的值进行排序,并给出前10个。“