MongoDB使用聚合功能选择子文档
我有一个mongo DB集合,看起来像这样:MongoDB使用聚合功能选择子文档,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个mongo DB集合,看起来像这样: { { _id: objectId('aabbccddeeff'), objectName: 'MyFirstObject', objectLength: 0xDEADBEEF, objectSource: 'Source1', accessCounter: { 'firstLocationCode' : 283
{
{
_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
值,则可以通过将其设置为所谓的覆盖查询来进一步加快查询速度,该查询返回的值来自索引本身。例如,当对子文档进行索引并查询topsecondLocation
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')。按降序对返回的值进行排序,并给出前十个。”