博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb如何对文档内数组进行过滤
阅读量:6369 次
发布时间:2019-06-23

本文共 2338 字,大约阅读时间需要 7 分钟。

clipboard.png

mongodb文档内包含数组,需要将数组中符合条件的数据过滤出来并返回结果集,可以用两种方式来查询
group
filter
数据源:
{    "_id" : ObjectId("5bbcc0c9a74db9804e78a157"),    "uid" : "1000001",    "name" : "zhangsan",    "addrs" : [         {            "is_query" : "1",            "city" : "北京"        },         {            "is_query" : "0",            "city" : "上海"        },         {            "is_query" : "1",            "city" : "深圳"        }    ]}{    "_id" : ObjectId("5bbcc167a74db9804e78a172"),    "uid" : "1000002",    "name" : "lisi",    "addrs" : [         {            "is_query" : "0",            "city" : "北京"        },         {            "is_query" : "0",            "city" : "上海"        },         {            "is_query" : "1",            "city" : "深圳"        }    ]}

要求查询指定uid下,addrs数组中只包含is_query等于1的结果集(0的不包含)。


查询语句:
方法一:使用
$unwind
addrs数组打散,获取结果集后用
$match筛选符合条件的数据,最后使用
$group进行聚合获取最终结果集。
db.getCollection('user').aggregate(    [        {               $unwind: "$addrs"         },        {             $match : {                "uid":"1000001",                 "addrs.is_query": "1"             }         },        {             $group : {                 "_id" : "$uid",                 "addrs": { $push: "$addrs" }             }         }     ])

Result:

{    "_id" : "1000001",    "addrs" : [         {            "is_query" : "1",            "city" : "北京"        },         {            "is_query" : "1",            "city" : "深圳"        }    ]}
方法二:使用
$match过滤符合条件的根文档结果集,然后使用
$project返回对应字段的同时,在
addrs数组中使用
$filter进行内部过滤,返回最终结果集
db.getCollection('user').aggregate(    [        {             $match : { "uid": "1000001" }         },        {            $project: {                "uid": 1,                "name": 1,                "addrs": {                    $filter: {                        input: "$addrs",                        as: "item",                        cond: { $eq : ["$$item.is_query","1"] }                    }                }            }        }    ])

Result:

{    "_id" : ObjectId("5bbcc0c9a74db9804e78a157"),    "uid" : "1000001",    "name" : "zhangsan",    "addrs" : [         {            "is_query" : "1",            "city" : "北京"        },         {            "is_query" : "1",            "city" : "深圳"        }    ]}
相对于
$group分组聚合返回结果集的方式,在当前查询要求下
$filter显得更加优雅一些,也比较直接。当然如果包含统计操作,比如要求返回
is_query等于
1的数量,这时候
$group就非常合适了。

转载地址:http://oirma.baihongyu.com/

你可能感兴趣的文章
地图点聚合优化方案
查看>>
Google Chrome 快捷方式
查看>>
备考PMP心得体会
查看>>
vue proxy匹配规则
查看>>
线上应用故障排查之一:高CPU占用
查看>>
Extend Volume 操作 - 每天5分钟玩转 OpenStack(56)
查看>>
IronPython教程
查看>>
squid via检测转发循环
查看>>
计算分页
查看>>
iptables 做nat路由器脚本
查看>>
数据结构(C语言版)第三章:栈和队列
查看>>
Stopping and/or Restarting an embedded Jetty in...
查看>>
Oracle存储过程中的数据集输入参数
查看>>
vsftp 配置
查看>>
VCSA中配置时间和时区,实测至6.5适用
查看>>
高并发IM系统架构优化实践
查看>>
产品经理教你玩转阿里云负载均衡SLB系列(一):快速入门--什么是负载均衡
查看>>
有关linux--进程组、会话、守护进程详解
查看>>
我的友情链接
查看>>
monkeyrunner运行Python脚本来检查apk渠道和验证是否可以调用微信
查看>>