在多表联合查询能力上,4.4 之前只提供了一个 $lookup stage 用于实现类似于 SQL 中的「left outer join」功能,在 4.4 中新增的 $unionWith stage 又提供了类似 SQL 中的「union all」功能,用户把两个集合中的数据聚合到一个结果集中,然后做指定的查询和过滤。区别于 $lookup stage 的是, $unionWith stage 支持分片集合。当在 Aggregate Pipeline 中使用了多个 $unionWith stage 的时候,可以对多个集合数据做聚合,使用方式如下:

{ $unionWith: { coll: "<collection>", pipeline: [ <stage1>, ... ] } }

假设我们现在有这样的数据:

db.orders_april.insertMany([
  { _id:1, item: "A", quantity: 100 },
  { _id:2, item: "B", quantity: 30 },
]);
db.orders_may.insertMany([
  { _id:1, item: "C", quantity: 20 },
  { _id:2, item: "A", quantity: 50 },
]);
db.orders_june.insertMany([
  { _id:1, item: "C", quantity: 100 },
  { _id:2, item: "D", quantity: 10 },
]);

现在我想知道orders_may,orders_june,orders_april这三个集合中,不同产品item的数量quantity总和是多少?

如果是以前,只能用代码来实现;现在可以:

db.orders_april.aggregate( [
   { $unionWith: "orders_may" },
   { $unionWith: "orders_june" },
   { $group: { _id: "$item", total: { $sum: "$quantity" } } },
   { $sort: { total: -1 }}
/* 1 */
    "_id" : "A",
    "total" : 150.0
/* 2 */
    "_id" : "C",
    "total" : 120.0
/* 3 */
    "_id" : "B",
    "total" : 30.0
/* 4 */
    "_id" : "D",
    "total" : 10.0

假设我们现在有这样的数据(site:1早餐,2中餐,3晚餐;placeId:地点ID;cateringDate:时间):

在这里插入图片描述
现在我想知道每天每个地方的早餐数,中餐数,晚餐数(即在一个集合中根据条件将多条数据合并成一条进行数据统计)?

db.catering.aggregate([ 
                "$unionWith" : {
                    "coll" : "catering",
                    "pipeline" : [ 
                        	//筛选条件早餐
                            "$match" : {
                                "site" : 1.0
                            "$addFields" : {
                                "breakfast" : 1.0,//早餐1份
                                "lunch" : 0.0,
                                "dinner" : 0.0
                "$unionWith" : {
                    "coll" : "catering",
                    "pipeline" : [ 
                        	//筛选条件中餐
                            "$match" : {
                                "site" : 2.0
                            "$addFields" : {
                                "breakfast" : 0.0,
                                "lunch" : 1.0,//中餐1份
                                "dinner" : 0.0
                "$unionWith" : {
                    "coll" : "catering",
                    "pipeline" : [ 
                        	//筛选条件晚餐
                            "$match" : {
                                "site" : 3.0
                            "$addFields" : {
                                "breakfast" : 0.0,
                                "lunch" : 0.0,
                                "dinner" : 1.0//晚餐1份
                "$addFields" : {
                	//日期格式化,因为是UTC时间所以+8小时
                    "cateringDateString" : {
                        "$dateToString" : {
                            "format" : "%Y-%m-%d",
                            "date" : "$cateringDate",
                            "timezone" : "+08:00"
                "$group" : {
                	//按照日期地点分组
                    "_id" : {
                        "date" : "$cateringDateString",
                        "placeId" : "$placeId"
                    //计算所有早餐
                    "totalBreakfast" : {
                        "$sum" : "$breakfast"
                    //计算所有中餐
                    "totalLunch" : {
                        "$sum" : "$lunch"
                    //计算所有晚餐
                    "totalDinner" : {
                        "$sum" : "$dinner"
                "$project" : {
                    "date" : "$_id.date",
                    "placeId" : "$_id.placeId",
                    "totalBreakfast" : 1.0,
                    "totalLunch" : 1.0,
                    "totalDinner" : 1.0,
                    "_id" : 0.0
                "$sort" : {
                    "date" : 1.0
                    在多表联合查询能力上,4.4 之前只提供了一个 lookupstage用于实现类似于SQL中的「leftouterjoin」功能,在4.4中新增的lookup stage 用于实现类似于 SQL 中的「left outer join」功能,在 4.4 中新增的lookupstage用于实现类似于SQL中的「leftouterjoin」功能,在4.4中新增的unionWith stage 又提供了类似 SQL 中的「union all」功能,用户把两个集合中的数据聚合到一个结果集中,然后做指定的查询和过滤。区
				
>>发布会传送门 了解产品详情 MongoDB 在今年正式发布了新的 4.4版本,这次的发布包含众多的增强 Feature,可以称之为是一个维护性的版本,而且是一个用户期待已久的维护性版本MongoDB 官方也把这次发布称为「User-Driven Engineering」,说明新版本主要是针对用户呼声最高的一些痛点,重点进行了改进。 而阿里云作为 MongoDB 官方的全球战略合作伙伴,也即将全网独家上线 4.4版本,下面就由阿里云 MongoDB 团队的工程师针对一些用户关注度比
此篇文章及以后的文章大部分都是从聚合管道(aggregation pipeline)的一些语法为基础讲解的,如果不理解聚合管道的话,可以先学习一下会比较容易理解. 可以参考 mongoDB Documentation 的 Pipeline Aggregaion Stages. 何为Union All 和 ...
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。 聚合框架中常用的几个操作: $project:修改输入文档的结构。可以用来重命名、增加或删除
criteria:查询条件 objNew:update对象和一些更新操作符 upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。 mult...
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的count(*)。 >db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) 集合中的数据格式: "_id" : ObjectId("577e09da6a857a35563587c0")
//创建数据库链接 //在1.7的版本驱动中这样写是会报 MongoServer方法已过时的 //MongoServer server =  MongoDB.Driver.MongoServer.Create(strconn);  //带有用户名,密码的如下写法,不带的则直接ip+端口就可以 const string connectionString = “mongodb://city:liyang@192.168.1.211:27017”; //得到一个客户端对象的引用                    GetServer()对服务器对象的引用           由于现在的公司用的不是mongodb,但是用mongodb用了那么多年; 它的变化本人也是时刻关注的;相比以前,可能没有实战了;只能自己demo; 本篇是基于mongodb中文官网,总结其自己感觉挺实用的特性; 并非揽括官方的所有特性; Hidden Indexes 根据名称,我们就知道其作用是隐藏索引,为什么要隐藏索引呢? 我们都知道数据库太多索引会导致性能下降。但是业务的复杂性,导致我们是不敢乱删索引的;万一删除了,又得重建索
MongoDB是一种流行的开源文档数据库,它支持高性能和高可用性,适合处理海量数据。本文将介绍如何在Linux系统上安装MongoDB 4.4.13。 1. 下载MongoDB 4.4.13 首先,到MongoDB官网下载相应的版本。在命令行界面中使用wget命令可以快速下载。 ```shell wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.4.13.tgz 2. 解压MongoDB安装包 下载完成后,使用tar命令解压MongoDB安装包。 ```shell tar xvzf mongodb-linux-x86_64-4.4.13.tgz 解压后,会在当前目录下生成一个mongodb-linux-x86_64-4.4.13目录,其中包含MongoDB的二进制文件和相关配置文件。 3. 配置环境变量 为了能够方便地在命令行中执行MongoDB程序,需要配置环境变量。 ```shell export PATH=mongodb-linux-x86_64-4.4.13/bin:$PATH 4. 启动MongoDB服务 在安装完MongoDB后,需要启动MongoDB服务。可以使用mongod命令启动MongoDB服务。 ```shell mongod 默认情况下,MongoDB会在/data/db目录下存储数据文件。如果需要使用不同的数据目录,可以使用--dbpath选项指定新的数据目录路径。 ```shell mongod --dbpath /path/to/data/directory 5. 使用MongoDB MongoDB默认监听27017端口,可以使用mongo命令连接MongoDB并开始使用。 ```shell mongo 以上就是如何在Linux系统上安装MongoDB 4.4.13的简单介绍。安装MongoDB并不难,只要按照以上步骤执行即可。MongoDB使用非常灵活,可以根据具体需求进行相应的配置和调整。