关键字: 嵌套 多层嵌套 子文档 聚集运算 分组

MongoDB 嵌套结构的数据非常常见, 它通过嵌套子文档,达到一对多的关联关系。但嵌套结构中按分类分组求子文档的数据计算,不能直接通过 $group 聚集运算来实现,需要将嵌套结构解开,由多层嵌套结构变成多条单层结构来计算,由于中间过程的处理,且还要借且其它函数辅助实现输出。下面以集合 order 为例说明,按 category 分组获取 term 的数量并按由大到小的顺序输出。

{ category: "movies",

terms: [{ term: "movie 1", total: 1000}, {term: "movie 2", total: 100} ]

{ category: "sports",

terms: [{ term: "football 1", total: 1000}, {term: "tennis 2", total: 120} ]

{ category: "movies",

terms: [{ term: "movie 1", total: 5000}, {term: "movie 2", total: 200},

{term: "movie 3", total: 280} ]

{ category: "sports",

terms: [{ term: "football 1", total: 4000}, {term: "tennis 2", total: 250},

{term: "tennis 2", total: 450} ]

MongoDB通过聚集运算 aggregate,group 实现如下:
db.order.aggregate([
{$unwind : "$terms"},
{ $group : { _id : {
category: "$category",
term: "$terms.term" },
total: {$sum : "$terms.total"}
}
},
{$sort : { total : -1} },
{ $project: {
_id: 0,
category: "$_id.category",
term: "$_id.term",
total:1}}
])

$unwind将 terms数组拆分成多条, 再由 $group 分组、求和、排序后,最后用 $project过滤字段输出。

如果有集算器协助 MongoDB,就不需要这么繁琐的组合运算:

集算器 SPL 不仅对解决嵌套分组,对 MongoDB 很多困难的计算都有帮助,可以参考《 辅助 MongoDB 计算》。

SPL 也能很方便地嵌入到 JAVA 应用,可参考 《Java 如何调用 SPL 脚本》

具体使用方法可参考《如何使用集算器》。

关键字:嵌套 多层嵌套 子文档 聚集运算 分组 MongoDB 嵌套结构的数据非常常见, 它通过嵌套子文档,达到一对多的关联关系。但嵌套结构中按分类分组求子文档的数据计算,不能直接通过 $group 聚集运算来实现,需要将嵌套结构解开,由多层嵌套结构变成多条单层结构来计算,由于中间过程的处理,且还要借且其它函数辅助实现输出。下面以集合 order 为例说明,按 category 分组获...
MongoDB 嵌套 结构的数据非常常见, 它通过 嵌套 文档 ,达到一对多的关联关系。但 嵌套 结构中按分类 分组 文档 的数据计算,不能直接通过 $group 聚集运算来 实现 ,需要将 嵌套 结构解开,由多层 嵌套 结构变成多条单层结构来计算,由于中间过程的处理,且还要借且其它函数辅助 实现 输出。下面以集合 order 为例说明,按 category 分组 获取 term 的数量并按由大到小的顺序输出。 { category: "movies", terms: [{ term: "movie 1", total: ...
mongo aggregate操作使用 $lookup ,$unwind,$project,$group操作符,执行多表连接查询,提取多表指定字段,对指定字段进行 分组 求和得到结果: db.getCollection('DeviceDetailInfo_20191230').aggregate([ { $lookup :{from:'DeviceDetailInfo_20191229',localField...
MongoDB 作为当前最流行的非关系型数据库,能通过 嵌套 文档 实现 一对多的关联关系。应用开发中,常会遇到对 嵌套 文档 结构的记录,进行 分组 汇总,如有数据: "warehouseNsId":"10","brandId":37,"financeOwnerId":1231882808817905665,"amount":0,"items":[ {"goodsNsId":"1353","price":"256.00","count":3}, {"goodsNsId":"1799","price":"25
mongo按照以下进行筛选即可。 query.addCriteria(Criteria.where(“provinces”).elemMatch(Criteria.where(“projects”).elemMatch(Criteria.where(“boxes”).elemMatch(Criteria.where(“id”).is(“1422”))))); 普通列({成员:1 | true}):表示要显示的内容 "_id" 列({"_id":0 | false}):表示 "_id" 列是否显示 条件过滤列({成员:表达式}):满足表达式 之后 的数据可以进行显示 首先,准备一点点数据 db.getColl...
这篇我们来看 mongodb 另一个非常有意思的东西,那就是 $lookup ,我们知道 mongodb 是一个 文档 型的数据库,而且它也是最像关系型数据库的 一种nosql,但是呢,既然 mongodb 是无模式的,自然就很难在关系型数据库中非常擅长的多表关联上发挥作用,在这之前,我们可以使用DbRef,但 是呢,在 mongodb 3.2 中给你增加了一个相当牛逼的手段,那就是 $lookup ,而且放到了a...
2017-06-16T13:50:49.552+0800 I CONTROL  [main] Hotfix KB2731284 or later update is not installed, will zero-out data files MongoDB shell version: 3.2.4 connecting to: test > db.inventory.find(
"_id" : ObjectId("5c3c2ade8e40eb21b5ca69f4"),      "merid" : "201901091526",      "merorderno" : "1547447008",      "usersn" : NumberInt(42838),      "payments&quot
MongoDB 中的$ date操作符是用于将日期字符串转换为日期对象的操作符。它可以用于聚合管道中的$project和$addFields阶段,以及在更新和插入操作中的$set操作符中。例如,以下聚合管道将字符串日期字段转换为日期对象: db.collection.aggregate([ $project: { date: { $dateFromString: { dateString: "$dateStringField" } } 这将从集合中选择一个名为`dateStringField`的字段,并将其转换为日期对象。