关键字:
嵌套 多层嵌套 子文档 聚集运算 分组
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"
MongoDB
中的$ date操作符是用于将日期字符串转换为日期对象的操作符。它可以用于聚合管道中的$project和$addFields阶段,以及在更新和插入操作中的$set操作符中。例如,以下聚合管道将字符串日期字段转换为日期对象:
db.collection.aggregate([
$project: {
date: { $dateFromString: { dateString: "$dateStringField" } }
这将从集合中选择一个名为`dateStringField`的字段,并将其转换为日期对象。