介绍
MongoDB正在Swift发展。 2.2版本引入了聚合框架 ,以替代Map-Reduce查询模型。 生成汇总报告是企业系统的经常性需求,而MongoDB在这方面大放异彩。 如果您不熟悉它,则可能需要查看此聚合框架介绍或性能调整和数据建模指南。
让我们重用我最初介绍的数据模型,同时展示出色的快速MongoDB插入功能 :
{
"_id" : ObjectId("5298a5a03b3f4220588fe57c"),
"created_on" : ISODate("2012-04-22T01:09:53Z"),
"value" : 0.1647851116706831
}
MongoDB 2.6聚合增强
在2.4版本中,如果我运行以下聚合查询:
db.randomData.aggregate( [
{
$match: {
"created_on" : {
$gte : new Date(Date.UTC(2012, 0, 1)),
$lte : new Date(Date.UTC(2012, 0, 10))
}
}
},
{
$group: {
_id : {
"minute" : {
$minute : "$created_on"
}
},
"values": {
$addToSet: "$value"
}
}
}]);
我达到了16MB的聚合结果限制:
{
"errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
"code" : 16389,
"ok" : 0
}
MongoDB文档限制为16MB ,并且在2.6版之前,聚合结果为BSON文档。 2.6版本将其替换为光标。
在2.6上运行相同的查询会产生以下结果:
db.randomData.aggregate( [
{
$match: {
"created_on" : {
$gte : new Date(Date.UTC(2012, 0, 1)),
$lte : new Date(Date.UTC(2012, 0, 10))
}
}
},
{
$group: {
_id : {
"minute" : {
$minute : "$created_on"
}
},
"values": {
$addToSet: "$value"
}
}
}])
.objsLeftInBatch();
14
我使用了基于游标的objsLeftInBatch方法来测试聚合结果类型,并且16MB的限制不再适用于整体结果。 游标内部结果是常规的BSON文档,因此它们仍然限制为16MB,但这比以前的整体结果限制更易于管理。
2.6版本还解决了聚合内存限制 。 完整的集合扫描,例如:
db.randomData.aggregate( [
{
$group: {
_id : {
"minute" : {
$minute : "$created_on"
}
},
"values": {
$addToSet: "$value"
}
}
}])
.objsLeftInBatch();
可能会出现以下错误:
{
"errmsg" : "exception: Exceeded memory limit for $group, but didn't allow external sort. Pass allowDiskUse:true to opt in.",
"code" : 16945,
"ok" : 0
}
因此,我们现在可以使用allowDiskUse参数执行大型排序操作 :
db.randomData.aggregate( [
{
$group: {
_id : {
"minute" : {
$minute : "$created_on"
}
},
"values": {
$addToSet: "$value"
}
}
}]
,
{
allowDiskUse : true
})
.objsLeftInBatch();
2.6版本允许我们使用新添加的$ out阶段将聚合结果保存到其他集合中。
db.randomData.aggregate( [
{
$match: {
"created_on" : {
$gte : new Date(Date.UTC(2012, 0, 1)),
$lte : new Date(Date.UTC(2012, 0, 10))
}
}
},
{
$group: {
_id : {
"minute" : {
$minute : "$created_on"
}
},
"values": {
$addToSet: "$value"
}
}
},
{
$out : "randomAggregates"
}
]);
db.randomAggregates.count();
60
添加了新的运算符,如let , map , cond ,仅举几例。
下一个示例将AM或PM附加到每个特定事件条目的时间信息中。
var dataSet = db.randomData.aggregate( [
{
$match: {
"created_on" : {
$gte : new Date(Date.UTC(2012, 0, 1)),
$lte : new Date(Date.UTC(2012, 0, 2))
}
}
},
{
$project: {
"clock" : {
$let: {
vars: {
"hour": {
$substr: ["$created_on", 11, -1]
},
"am_pm": { $cond: { if: { $lt: [ {$hour : "$created_on" }, 12 ] } , then: 'AM',else: 'PM'} }
},
in: { $concat: [ "$$hour", " ", "$$am_pm"] }
}
}
}
},
{
$limit : 10
}
]);
dataSet.forEach(function(document) {
printjson(document);
});
导致:
"clock" : "16:07:14 PM"
"clock" : "22:14:42 PM"
"clock" : "21:46:12 PM"
"clock" : "03:35:00 AM"
"clock" : "04:14:20 AM"
"clock" : "03:41:39 AM"
"clock" : "17:08:35 PM"
"clock" : "18:44:02 PM"
"clock" : "19:36:07 PM"
"clock" : "07:37:55 AM"
结论
MongoDB 2.6版本具有许多其他增强功能,例如批量操作或索引交集 。 MongoDB不断发展,为基于文档的存储提供了可行的替代方案。 以如此高的发展速度,难怪它被评为2013年度数据库 。
翻译自: https://www.javacodegeeks.com/2014/04/mongodb-2-6-is-out.html