作者回复: 谢谢分享!
作者回复: queryPlanner并不能保证100%找到最优的索引,所以才在必要的时候使用hint来强制指定。当你自己选了合适的索引执行以后,这个计划就会被cache,所以下次不用hint,可能也就是用了你这个cached的(最佳)索引。 这个是我的一个推断。你可以清除下query plan cache再重新跑一下,看看是否还是能默认用到最佳索引。
作者回复: 如果是无条件全表count,这个很快因为是实时计数的。 带条件count取决于:1) 是否用到索引 2)你的数据是否都在内存 3)你的存储IO是否够快 - SSD vs SAS vs SATA 有很大差别 通常来说这种操作会需要几十秒到分钟级如果没有优化。
作者回复: 用于lookup 的字段,特别是 foreignField 在被lookup 表里面,必须要有索引。多半是因为这个
作者回复: MongoDB企业版中有支持SQL方式查询的工具。
作者回复: 理论上没有,只有bson 大小限制(16MB)。但实际上我用到1000的时候查询就很慢了。
作者回复: mapReduce已经是deprecated,基本不维护。 Aggregation 是 替代产品,用C++写,性能比较保证。 但是mapReduce很灵活,可以写JS脚本。 Aggregation要按照指定的语法,有些场景可能难以实现。 所以,如果能用agg做的,尽量用agg 如果逻辑太复杂,就用MR
作者回复: 对的。 $lte: 小于等于。所以是女员工数量等于或少于10的部门
作者回复: 目前没有取别名的功能。只能按照区间值
作者回复: 没有sumif这个keyword,但是可以实现类似的事情,下面这个例子是只把>=10 的$a字段的值相加求和: db.collection.aggregate([{ $group: { _id: null, total: { $sum: { $cond: [{ $gte: ["$a", 10] }, "$a", 0 ] } } } }])