资讯专栏INFORMATION COLUMN

mongodb中的aggregate(聚合查询)

Seay / 942人阅读

摘要:什么是类似于拆分结果然后对结果进行分析求值然后再返回新结果文档聚合官方运用篇个人总结案例一案例二案例三案例那么有什么作用呢举个例子文档中有如下几个集合集合一集合二集合三我们想筛选出中为的集合理所当然我们会这样写当然这样写是能拿到结

什么是aggregate

aggregate类似于pipe.拆分结果然后对结果进行分析求值然后再返回新结果..

文档

MongoDB聚合
官方API
MongoDB aggregate 运用篇 个人总结 - fycayy
案例一
案例二
案例三

案例

那么aggregate有什么作用呢?举个例子 testName文档中有如下几个集合

//集合一
{
    _id:1,
    list:[
        {name:"x",age:11,sex:"boy"},
        {name:"y",age:12,sex:"girl"},
        {name:"z",age:13,sex:"boy"},
        {name:"n",age:14,sex:"boy"},
    ]
}
//集合二
{
    _id:2,
    list:[
        {name:"q",age:15,sex:"boy"},
        {name:"w",age:16,sex:"girl"},
        {name:"e",age:17,sex:"girl"},
        {name:"r",age:18,sex:"boy"},
    ]
}
//集合三
{
     _id:3,
    list:[
        {name:"a",age:19,sex:"girl"},
        {name:"s",age:20,sex:"girl"},
        {name:"d",age:21,sex:"girl"},
        {name:"f",age:22,sex:"boy"},
    ]
}

我们想筛选出list中sex为boy的集合.理所当然我们会这样写

db.testName.find({"list":{"$elemMatch":{"sex":"boy"}}})

当然这样写是能拿到结果的.拿到的是什么结果呢?结果会返回所有的sex=boy的集合,并且sex=girl的数据也包含在内.但是我们只想要sex=boy的数据.这时候就可以用聚合查询了

聚合查询
db.testName.aggregate(
    {"$unwind":"$list"},
    {"$match":{"list.sex":{"$eq":"boy"}}},     
    {
        "$group":{
            "_id":"$_id",
            "results":{
                "$push"{"name":"$list.name","age":"$list.age","sex":"$list.sex"}
            }
        }
    }   
)

okay,不要怕.我们慢慢来分析 首先从$unwind来分析.$unwind会拆分数组元素拆分成一个一个集合那么这条参数执行后会得到什么结果呢?

{
    _id:1,
    list:{name:"x",age:11,sex:"boy"},
}
{
    _id:1,
    list:{name:"y",age:12,sex:"girl"},
}
{
    _id:1,
    list:{name:"z",age:13,sex:"boy"},
}
...

会拆分成一条条的临时集合,这个临时集合的名称就是$list,这就相当于第一道工艺程序把数组拆分开.接下来交给第二道程序{"$match":{"list.sex":{"$eq":"boy"}}} 这条语句作用是啥呢?想必大家也知道了.就是对临时的集合进行一个查询,类似于db.$list.find(),那么查询到的肯定就是sex=boy的数据了 现在返回的数据就是 不会有sex=girl的存在了

{
    _id:1,
    list:{name:"x",age:11,sex:"boy"},
}
{
    _id:1,
    list:{name:"z",age:13,sex:"boy"},
}
....

接下来就是要把这些组合在一起,也就是第三道工艺程序

{
    "$group":{
        "_id":"$_id",
        "results":{
            "$push"{"name":"$list.name","age":"$list.age","sex":"$list.sex"}
        }
    }
} 

其实也很好理解,$group就是组合的意思,把这些零散的数据以我们想要的形式组合起来.这个$_id指的就是临时集合中的_id.那么$list就是临时集合中的list,以_id为首把这些零散的list给组合成一个新的数组就是聚合.$push是添加一个对象,当然也有更简单的方式

{
    "$group":{
        "_id":"$_id",
        "results":{
            "$push":"$list"
        }
    }
} 

这样就直接把整个list对象给push到一个数组中.那么这样查询最终返回的结果就是我们想要的结果了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18837.html

相关文章

  • mongodb中的aggregate(聚合查询)

    摘要:什么是类似于拆分结果然后对结果进行分析求值然后再返回新结果文档聚合官方运用篇个人总结案例一案例二案例三案例那么有什么作用呢举个例子文档中有如下几个集合集合一集合二集合三我们想筛选出中为的集合理所当然我们会这样写当然这样写是能拿到结 什么是aggregate aggregate类似于pipe.拆分结果然后对结果进行分析求值然后再返回新结果.. 文档 MongoDB聚合官方APIMongo...

    leanote 评论0 收藏0
  • MongoDB指南---16、聚合

    摘要:将返回结果限制为前个。所以,聚合的结果必须要限制在以内支持的最大响应消息大小。包含字段和排除字段的规则与常规查询中的语法一致。改变字符大小写的操作,只保证对罗马字符有效。只对罗马字符组成的字符串有效。 上一篇文章:MongoDB指南---15、特殊的索引和集合:地理空间索引、使用GridFS存储文件下一篇文章:MongoDB指南---17、MapReduce 如果你有数据存储在Mon...

    Keagan 评论0 收藏0
  • MongoDB指南---16、聚合

    摘要:将返回结果限制为前个。所以,聚合的结果必须要限制在以内支持的最大响应消息大小。包含字段和排除字段的规则与常规查询中的语法一致。改变字符大小写的操作,只保证对罗马字符有效。只对罗马字符组成的字符串有效。 上一篇文章:MongoDB指南---15、特殊的索引和集合:地理空间索引、使用GridFS存储文件下一篇文章:MongoDB指南---17、MapReduce 如果你有数据存储在Mon...

    _Zhao 评论0 收藏0
  • mongoDB查询进阶】聚合管道(二) -- 阶段操作符

    摘要:当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用,具体用法下一篇文章阐述。另外再加以配合表达式操作符组成的表达式或者在或中使用累加器能查询统计的内容会更加的多样化。 上篇最后说到管道操作符,本篇文章将详细说一下管道操作符。 mongoDB查询进阶--聚合管道(一)回顾 什么是管道操作符(Aggregation Pipeline Operators) ...

    brianway 评论0 收藏0
  • mongoDB查询进阶】聚合管道(二) -- 阶段操作符

    摘要:当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用,具体用法下一篇文章阐述。另外再加以配合表达式操作符组成的表达式或者在或中使用累加器能查询统计的内容会更加的多样化。 上篇最后说到管道操作符,本篇文章将详细说一下管道操作符。 mongoDB查询进阶--聚合管道(一)回顾 什么是管道操作符(Aggregation Pipeline Operators) ...

    flybywind 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<