【问题标题】:MongoDB select subdocument with aggregation functionMongoDB选择具有聚合功能的子文档
【发布时间】:2017-06-23 21:57:54
【问题描述】:

我有一个看起来像这样的 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 个文档"

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

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

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

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

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

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

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

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

    如果您只需要 accessCounter 值,则可以进一步加快此速度,方法是将其设置为所谓的覆盖查询,该查询的返回值来自索引本身。例如,当您对子文档进行索引并查询顶部的 secondLocations 时,您应该能够使用以下命令进行覆盖查询:

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

    翻译为“获取所有文档('{}'),不要像默认情况下那样返回_id字段('_id:0'),只获取'accessCounter.secondLocation'字段(' accessCounter.secondLocation:1')。将返回的值按降序排序,给我前十个。”

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 2019-06-13
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      相关资源
      最近更新 更多