MongoDB属于 NoSql 中的基于分布式文件存储的文档型数据库,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。Mongo 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,但是写起来并不简单。若能集算器 SPL 语言结合,处理起来就相对容易多了。
现在我们针对 MongoDB 在计算方面的问题进行讨论分析,通过集算器 SPL 语言加以改进,方便用户使用 MongoDB。现从如下情况加以说明:
1. 单表内嵌数组结构的统计............................................... 1
2. 单表内嵌文档求和......................................................... 3
3. 分段分组结构................................................................ 5
4. 同构表合并................................................................... 6
5. 关联嵌套结构情况 1...................................................... 8
6. 关联嵌套结构情况 2..................................................... 10
7. 关联嵌套结构情况 3..................................................... 11
8. 多字段分组统计........................................................... 14
9. 两表关联查询............................................................... 16
10. 多表关联查询............................................................. 17
11. 指定数组查找............................................................. 19
12. 关联表中的数组查找................................................... 20
1. 单表内嵌数组结构的统计
两个关联表,表 A 与表 B 中的内嵌文档信息关联, 且返回的信息在内嵌文档中。表 childsgroup 字段 childs 是嵌套数组结构,需要合并的信息 name 在其下。
history:
两个关联表,表 A 与表 B 中的内嵌文档信息关联, 将信息合并到内嵌文档中。表 txtPost 字段 comment 是嵌套数组结构,需要把 comment_content 合并到其下。
txtComment:
两个关联表,表 A 与表 B 中的内嵌文档信息关联, 且返回的信息在记录上。表 collection2 字段 product 是嵌套数组结构,返回的信息是 isCompleted 等字段。
测试数据:
collection1:
_id: '5bc2e44a106342152cd83e97',
description:
status: 'Good',
machine: 'X'
order: 'A',
lot: '1'
collection2:
_id: '5bc2e44a106342152cd83e80',
isCompleted: false,
serialNo: '1',
batchNo: '2',
product: [ // note the subdocuments here
{order: 'A', lot: '1'},
{order: 'A', lot: '2'}
_id: 5bc2e44a106342152cd83e97,
description:
status: 'Good',
machine: 'X',
order: 'A',
lot: '1' ,
isCompleted: false,
serialNo: '1',
batchNo: '2'
Mongo 脚本
db.collection1.aggregate([{
$lookup
: {
from:
"collection2"
let: {order:
"\$order"
, lot:
"\$lot"
pipeline: [{
$match
: {
$expr
:{ \
: [ { order:
"\$\$order"
, lot:
"\$\$lot"
"\$product"
"isCompleted"
}, {
$addFields
: {
"isCompleted"
: {\
$arrayElemAt
"\$isCompleted"
}, {
$addFields
: {
// add the required fields to the top level structure
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员