我有一个包含数百万行的mongoDB集合,我正在try 优化我的查询.我目前正在使用聚合框架来检索数据,并根据需要对它们进行分组.我典型的聚合查询是:$match > $group > $ group > $project

然而,我注意到最后的部分只需要几毫秒,开始是最慢的.

我try 只使用$match过滤器执行查询,然后使用collection执行相同的查询.发现聚合查询需要约80毫秒,而查找查询需要0或1毫秒.

我几乎每个字段都有索引,所以我想这不是问题所在.知道会出什么问题吗?或者这只是聚合框架的一个"正常"缺陷?

我可以使用find查询而不是聚合查询,但是我必须在请求后执行大量处理,这个过程可以用$group等快速完成.所以我宁愿保留聚合框架.

谢谢

编辑:

以下是我的标准:

{
    "action" : "click",
    "timestamp" : {
            "$gt" : ISODate("2015-01-01T00:00:00Z"),
            "$lt" : ISODate("2015-02-011T00:00:00Z")
    },
    "itemId" : "5"
}

推荐答案

aggregation framework的主要目的是简化对大量条目的查询,并生成对您有价值的少量结果.

正如您所说,您也可以使用多个find个查询,但请记住,您不能用find个查询创建新字段.另一方面,$group阶段允许您定义新字段.

如果你想实现aggregation framework的功能,你很可能必须运行一个初始的find(或链接几个),提取信息,并用编程语言进一步操作它.

aggregation pipeline可能需要更长的时间,但至少你知道你只需要考虑一个系统的性能——MongoDB引擎.

然而,当涉及到操作find查询返回的数据时,您很可能需要使用编程语言进一步操作数据,从而根据所选编程语言的复杂性增加复杂性.

Mongodb相关问答推荐

在MongoDB中是否可以按递增顺序更新多个文档?

如何根据两个 struct 创建一个Mongo文档?

MongoDB获取所有文档谁的S子文档只包含一个特定值?

所有文档中嵌套 struct 中的条件匹配-mongodb

Mongodb聚合查找异常值

Mongoose 更新不同类型的记录

创建索引需要很长时间

为什么使用整数作为 pymongo 的键不起作用?

查找对象是否在预保存钩子mongoose中更改

mongodb 中的 --bindip 配置选项有什么作用?

如何在 MongoDb 中使用杰克逊将日期字段存储为 ISODate()

MongoDB:设置 Windows 服务

删除嵌套文档数组中的嵌入文档

Java MongoDB/BSON 类混淆

MongoDB 1.6.5:如何重命名集合中的字段

Express 无法 PUT/DELETE 方法.出了什么问题?

为 php 5.6 (XAMPP) 添加 mongodb 扩展

在 URL 中使用 ID(来自 mongo 的 ObjectId)是否安全?

RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要什么 inverse_of ?

MongoDB:自动生成的 ID 为零