服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - mongodb如何对文档内数组进行过滤的方法步骤

mongodb如何对文档内数组进行过滤的方法步骤

2020-05-19 15:19ZevFang MongoDB

这篇文章主要介绍了mongodb如何对文档内数组进行过滤的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了mongodb如何对文档内数组进行过滤的方法步骤,分享给大家,具体如下:

mongodb如何对文档内数组进行过滤的方法步骤

mongodb文档内包含数组,需要将数组中符合条件的数据过滤出来并返回结果集,可以用两种方式来查询group或filter。
数据源:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "_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进行聚合获取最终结果集。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
db.getCollection('user').aggregate(
  [
    
      $unwind: "$addrs"
    },
    {
      $match : {
        "uid":"1000001",
        "addrs.is_query": "1"
      }
    },
    {
      $group : {
        "_id" : "$uid",
        "addrs": { $push: "$addrs" }
      }
    }
  ]
)

Result:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "_id" : "1000001",
  "addrs" : [
    {
      "is_query" : "1",
      "city" : "北京"
    },
    {
      "is_query" : "1",
      "city" : "深圳"
    }
  ]
}

方法二:使用$match过滤符合条件的根文档结果集,然后使用$project返回对应字段的同时,在addrs数组中使用$filter进行内部过滤,返回最终结果集

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "_id" : ObjectId("5bbcc0c9a74db9804e78a157"),
  "uid" : "1000001",
  "name" : "zhangsan",
  "addrs" : [
    {
      "is_query" : "1",
      "city" : "北京"
    },
    {
      "is_query" : "1",
      "city" : "深圳"
    }
  ]
}

相对于$group分组聚合返回结果集的方式,在当前查询要求下$filter显得更加优雅一些,也比较直接。当然如果包含统计操作,比如要求返回is_query等于1的数量,这时候$group就非常合适了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000016629733

延伸 · 阅读

精彩推荐
  • MongoDBMongoDB的索引

    MongoDB的索引

    数据库中的索引就是用来提高查询操作的性能,但是会影响插入、更新和删除的效率,因为数据库不仅要执行这些操作,还要负责索引的更新 ...

    MongoDB教程网2532020-05-12
  • MongoDBMongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    这篇文章主要给大家介绍了关于MongoDB查询之高级操作(多条件查询、正则匹配查询等)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者...

    w田翔3872020-12-19
  • MongoDB在mac系统下安装与配置mongoDB数据库

    在mac系统下安装与配置mongoDB数据库

    这篇文章主要介绍了在mac系统下安装与配置mongoDB数据库的操作步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    CXYhh1219312021-11-14
  • MongoDBmongodb数据库基础知识之连表查询

    mongodb数据库基础知识之连表查询

    这篇文章主要给大家介绍了关于mongodb数据库基础知识之连表查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参...

    ZJW02155642020-05-22
  • MongoDBMongoDB系列教程(五):mongo语法和mysql语法对比学习

    MongoDB系列教程(五):mongo语法和mysql语法对比学习

    这篇文章主要介绍了MongoDB系列教程(五):mongo语法和mysql语法对比学习,本文对熟悉Mysql数据库的同学来说帮助很大,用对比的方式可以快速学习到MongoDB的命...

    MongoDB教程网3252020-05-01
  • MongoDBMongodb索引的优化

    Mongodb索引的优化

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。接下来通过本文给大家介绍Mongodb索引的优化,本文介绍的非常详细,具有参考借鉴价值,感...

    MRR3252020-05-05
  • MongoDBMongoDB多条件模糊查询示例代码

    MongoDB多条件模糊查询示例代码

    这篇文章主要给大家介绍了关于MongoDB多条件模糊查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值...

    浅夏晴空5902020-05-25
  • MongoDBWindows下MongoDB配置用户权限实例

    Windows下MongoDB配置用户权限实例

    这篇文章主要介绍了Windows下MongoDB配置用户权限实例,本文实现需要输入用户名、密码才可以访问MongoDB数据库,需要的朋友可以参考下 ...

    MongoDB教程网3082020-04-29