IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MongoDB 管道查询 -> 正文阅读

[大数据]MongoDB 管道查询

数据准备

UserPO

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "user")
public class UserPO extends BasePO {

    private String name;

    private String description;

}

UserGroupPO

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "user_group")
public class UserGroupPO extends BasePO {

    private String name;

    private String description;

    private List<Long> userIds;

}

用户数据
在这里插入图片描述

用户组数据
在这里插入图片描述

?

条件查询

match:and 匹配
查询用户组 id 等于 1,且删除标识等于 N 的数据

db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("1")
        }, {
            "deleteFlag": "N"
        }]
    }
}]);

match:or 匹配
查询用户 name 等于 nn 或者 description 等于 dd 的数据

db.getCollection("user").aggregate([{
    "$match": {
        "$or": [{
            "name": "nn"
        }, {
            "description": "dd"
        }]
    }
}]);

?

聚合查询

查询用户组里的用户详情

拆分数据

unwind:将文档中的某一个数组类型字段拆分成多条
实现:根据 userIds 把用户组拆分了多行

db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("2809813774582045833")
        }, {
            "deleteFlag": "N"
        }]
    }
}, {
    "$unwind": "$userIds"
}]);

在这里插入图片描述

关联查询

?
lookup:关联查询,类似于 MySQL 的 left jion 效果
实现:根据 userIds 查询用户详情,注意:查出来的 user 是个数组

  • from 同一个数据库下等待被Join的集合。
  • localField 源集合中的match值,如果输入的集合中,某文档没有 localField
    这个Key(Field),在处理的过程中,会默认为此文档含
    有 localField:null的键值对。
  • foreignField待Join的集合的match值,如果待Join的集合中,文档没有foreignField
    值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。
  • as 为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉
db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("4523281346310580824")
        }, {
            "deleteFlag": "N"
        }]
    }
}, {
    "$unwind": "$userIds"
}, {
    "$lookup": {
        "from": "user",
        "localField": "userIds",
        "foreignField": "_id",
        "as": "user"
    }
}]);

在这里插入图片描述

?

控制显示

project 控制字段显示与否
实现: 删除无用字段,

  • 普通列({成员:1 | true}):表示要显示的内容
  • “_id” 列({“_id”:0 | false}):表示 “_id” 列是否显示
db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("4523281346310580824")
        }, {
            "deleteFlag": "N"
        }]
    }
}, {
    "$unwind": "$userIds"
}, {
    "$lookup": {
        "from": "user",
        "localField": "userIds",
        "foreignField": "_id",
        "as": "user"
    }
}, {
    "$project": {
        "user": 1,
        "_id": 0,
        
    }
}]);

在这里插入图片描述
?

字段置顶

arrayElemAt:将指定文档提升到顶级并替换所有其它字段。该操作会替换输入文档中的所有现在字段,包括_id字段
replaceRoot:返回存在于给定数组的指定索引上的元素
实现:把 user 的第一个元素提至顶级

db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("4523281346310580824")
        }, {
            "deleteFlag": "N"
        }]
    }
}, {
    "$unwind": "$userIds"
}, {
    "$lookup": {
        "from": "user",
        "localField": "userIds",
        "foreignField": "_id",
        "as": "user"
    }
}, {
    "$project": {
        "user": 1,
        "_id": 0,
        
    }
}, {
    "$replaceRoot": {
        "newRoot": {
            "$arrayElemAt": ["$user", 0]
        }
    }
}]);

在这里插入图片描述
此数据格式已经非常漂亮,符合日常返回格式,完成了需求

?

合并字段

mergeObjects:将多个文档合并为一个文档,如果要合并的文档包含相同的字段名,则结果文档中的字段具有该字段最后一个合并文档中的值
实现:保留 userGroup 的信息

db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("4523281346310580824")
        }, {
            "deleteFlag": "N"
        }]
    }
}, {
    "$unwind": "$userIds"
}, {
    "$lookup": {
        "from": "user",
        "localField": "userIds",
        "foreignField": "_id",
        "as": "user"
    }
}, {
    "$replaceRoot": {
        "newRoot": {
            "$mergeObjects": [{
                "$arrayElemAt": ["$user", 0]
            }, "$$ROOT"]
        }
    }
},{
    "$project": {
        "user": 0
    }
}]);

在这里插入图片描述
?

新增字段

set:字段存在则修改,无则新增
实现:

db.getCollection("user_group").aggregate([{
    "$match": {
        "$and": [{
            "_id": NumberLong("4523281346310580824")
        }, {
            "deleteFlag": "N"
        }]
    }
}, {
    "$unwind": "$userIds"
}, {
    "$lookup": {
        "from": "user",
        "localField": "userIds",
        "foreignField": "_id",
        "as": "user"
    }
}, {
    "$replaceRoot": {
        "newRoot": {
            "$mergeObjects": [{
                "$arrayElemAt": ["$user", 0]
            }, "$$ROOT"]
        }
    }
}, {
    "$project": {
        "user": 0
    }
}, {
    "$set": {
        "accounts": "accounts",
        "deleteFlag": "deleteFlag"
    }
}]);

在这里插入图片描述
?

模糊查询

count:计算总数
实现:查询 user 表的总条数

db.getCollection("user").aggregate([
    {
        "$count": "total"
    }
]);

在这里插入图片描述

?

分页查询

分页:对数据做分页处理
跳过 3 条数据,从第 4 条起,显示 2 条

  • skip:跳过多少条
  • limit:显示多少条
db.getCollection("user").aggregate([
    {
        "$skip": 3
    },
    {
        "$limit": 2
    }
]);

在这里插入图片描述
?

分页查询加总数

分页查询需要同时返回总数和数据
facet:在同一组输入文档的单一阶段中处理多个聚合管道;每个子管道在输出文档中都有自己的字段,其结果存储在文档数组中

db.getCollection("user").aggregate([
    {
        "$facet": {
            "metadata": [{
                "$count": "total"
            }],
            "records": [{
                "$skip": 0
            }, {
                "$limit": 10
            }]
        }
    }
]);

在这里插入图片描述
metadata 不太符合常规数据结构,把它去掉,把 total 提上顶层

db.getCollection("user").aggregate([
    {
        "$facet": {
            "metadata": [{
                "$count": "total"
            }],
            "records": [{
                "$skip": 0
            }, {
                "$limit": 2
            }]
        }
    },
    {
        "$replaceRoot": {
            "newRoot": {
                "$mergeObjects": [{
                    "$arrayElemAt": ["$metadata", 0]
                }, "$$ROOT"]
            }
        }
    },
    {
        "$project": {
            "metadata": 0
        }
    }
]);

在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:41:07  更:2022-10-17 12:42:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/19 20:24:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码