Mongodb过滤器filter选择要返回的数组子集操作方法

 更新时间:2023年07月19日 14:36:18   作者:Ethanchen's notes  
Mongodb使用过滤器 $filter根据指定条件选择要返回的数组子集,这篇文章主要介绍了Mongodb对嵌套文档数组进行查询操作,需要的朋友可以参考下

Mongodb过滤器

Mongodb使用过滤器 $filter 根据指定条件选择要返回的数组子集。返回仅包含与条件匹配的元素的数组。返回的元素按原始顺序排列。也就是说,这个是选择你要的文档,而不是排除。 如果该数组没有符合条件 ,则为 空 []

$filter: 选择数组的子集以返回仅包含与过滤条件匹配的元素的数组。

插入测试数据

sit_rs1:PRIMARY> db.user.insertMany([
...  { name: "user1", age: 10, letter: [{"x":"X1", "y":"Y1"}, {"x":"X2", "y":"Y2"}, {"x":"X3", "y":"Y3"}], number: [ { "n1":2, "n2":6 }, { "n1":3, "n2":3 }, { "n1":5, "n2":6 } ] },
...  { name: "user2", age: 20, letter: [{"V":"V1", "y":"Y1"}, {"V":"V2", "y":"Y2"}, {"V":"V3", "y":"Y3"}], number: [ { "n1":1, "n2":3 }, { "n1":4, "n2":5 }, { "n1":7, "n2":6 } ] },
...  { name: "user3", age: 30, letter: [{"V":"V1", "w":"W1"}, {"V":"V2", "w":"W2"}, {"V":"V3", "w":"W3"}], number: [ { "n1":1, "n2":8 }, { "n1":2, "n2":6 }, { "n1":2, "n2":6 } ] },
...  { name: "user4", age: 45, letter: [{"z":"Z1", "w":"W1"}, {"z":"Z2", "w":"W2"}, {"z":"Z3", "w":"W3"}], number: [ { "n1":9, "n2":8 }, { "n1":2, "n2":4 }, { "n1":3, "n2":6 } ] },
...  { name: "user5", age: 55, letter: [{"z":"Z1", "u":"U1"}, {"z":"Z2", "u":"U2"}, {"z":"Z3", "u":"U3"}], number: [ { "n1":7, "n2":8 }, { "n1":8, "n2":4 }, { "n1":4, "n2":6 } ] },
...  { name: "user6", age: 55, letter: [{"t":"T1", "u":"U1"}, {"t":"T2", "u":"U2"}, {"t":"T3", "u":"U3"}], number: [ { "n1":5, "n2":8 }, { "n1":8, "n2":5 }, { "n1":7, "n2":6 } ] },
... ])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("64b661869be837dc8e997b74"),
                ObjectId("64b661869be837dc8e997b75"),
                ObjectId("64b661869be837dc8e997b76"),
                ObjectId("64b661869be837dc8e997b77"),
                ObjectId("64b661869be837dc8e997b78"),
                ObjectId("64b661869be837dc8e997b79")
        ]
}
sit_rs1:PRIMARY> db.user.find()
{ "_id" : ObjectId("64b661869be837dc8e997b74"), "name" : "user1", "age" : 10, "letter" : [ { "x" : "X1", "y" : "Y1" }, { "x" : "X2", "y" : "Y2" }, { "x" : "X3", "y" : "Y3" } ], "number" : [ { "n1" : 2, "n2" : 6 }, { "n1" : 3, "n2" : 3 }, { "n1" : 5, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b75"), "name" : "user2", "age" : 20, "letter" : [ { "V" : "V1", "y" : "Y1" }, { "V" : "V2", "y" : "Y2" }, { "V" : "V3", "y" : "Y3" } ], "number" : [ { "n1" : 1, "n2" : 3 }, { "n1" : 4, "n2" : 5 }, { "n1" : 7, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b76"), "name" : "user3", "age" : 30, "letter" : [ { "V" : "V1", "w" : "W1" }, { "V" : "V2", "w" : "W2" }, { "V" : "V3", "w" : "W3" } ], "number" : [ { "n1" : 1, "n2" : 8 }, { "n1" : 2, "n2" : 6 }, { "n1" : 2, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b77"), "name" : "user4", "age" : 45, "letter" : [ { "z" : "Z1", "w" : "W1" }, { "z" : "Z2", "w" : "W2" }, { "z" : "Z3", "w" : "W3" } ], "number" : [ { "n1" : 9, "n2" : 8 }, { "n1" : 2, "n2" : 4 }, { "n1" : 3, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b78"), "name" : "user5", "age" : 55, "letter" : [ { "z" : "Z1", "u" : "U1" }, { "z" : "Z2", "u" : "U2" }, { "z" : "Z3", "u" : "U3" } ], "number" : [ { "n1" : 7, "n2" : 8 }, { "n1" : 8, "n2" : 4 }, { "n1" : 4, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b79"), "name" : "user6", "age" : 55, "letter" : [ { "t" : "T1", "u" : "U1" }, { "t" : "T2", "u" : "U2" }, { "t" : "T3", "u" : "U3" } ], "number" : [ { "n1" : 5, "n2" : 8 }, { "n1" : 8, "n2" : 5 }, { "n1" : 7, "n2" : 6 } ] }

$filter 具有以下语法:

{ $filter: { input: <array>, as: <string>, cond: <expression> } }
  • input: 解析为数组的表达式。
  • as: 可选的。代表数组中每个单独元素的变量名称input。如果未指定名称,则变量名称默认为this。
  • cond: 解析为布尔值的表达式,用于确定是否应将某个元素包含在输出数组中。表达式使用as中指定的变量名分别引用输入数组的每个元素。
# 以下示例选择 number 数组 n1 字段 仅包含 “大于5” 的文档:
sit_rs1:PRIMARY> db.user.aggregate([
...    {
...       $project: {
...          number: {
...             $filter: {
...                input: "$number",
...                as: "number",
...                cond: { $gt: [ "$$number.n1", 5 ] }
...             }
...          }
...       }
...    }
... ])
{ "_id" : ObjectId("64b661869be837dc8e997b74"), "number" : [ ] }
{ "_id" : ObjectId("64b661869be837dc8e997b75"), "number" : [ { "n1" : 7, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b76"), "number" : [ ] }
{ "_id" : ObjectId("64b661869be837dc8e997b77"), "number" : [ { "n1" : 9, "n2" : 8 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b78"), "number" : [ { "n1" : 7, "n2" : 8 }, { "n1" : 8, "n2" : 4 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b79"), "number" : [ { "n1" : 8, "n2" : 5 }, { "n1" : 7, "n2" : 6 } ] }

as: 是可选的。如果未指定名称,则变量名称默认为this。下面使用 this 代替。

sit_rs1:PRIMARY> db.user.aggregate([
...    {
...       $project: {
...          number: {
...             $filter: {
...                input: "$number",
...                cond: { $gt: [ "$$this.n1", 5 ] }
...             }
...          }
...       }
...    }
... ])
{ "_id" : ObjectId("64b661869be837dc8e997b74"), "number" : [ ] }
{ "_id" : ObjectId("64b661869be837dc8e997b75"), "number" : [ { "n1" : 7, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b76"), "number" : [ ] }
{ "_id" : ObjectId("64b661869be837dc8e997b77"), "number" : [ { "n1" : 9, "n2" : 8 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b78"), "number" : [ { "n1" : 7, "n2" : 8 }, { "n1" : 8, "n2" : 4 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b79"), "number" : [ { "n1" : 8, "n2" : 5 }, { "n1" : 7, "n2" : 6 } ] }

聚合管道更新

从 MongoDB 4.2 开始,您可以使用聚合管道进行更新:使用聚合管道可以实现更具表现力的更新语句,例如基于当前字段值表达条件更新或使用另一个字段的值更新一个字段。

以下示例,使用 filter 选择数组的子集, 再更新原来的数组。

# 以下示例选择 number 数组 n1 字段 仅包含 “大于5” 的文档:并更新替换原来的数组 
sit_rs1:PRIMARY> db.user.updateMany(
...   { "number": { $exists: true } }, 
...   [{ 
...       $set: { 
...           "number": { 
...               $filter: { 
...   			      input: "$number", 
...   			      as: "number", 
...   			      cond: { $gt: [ "$$number.n1", 5 ] }
...   			  } 
...   		   } 
...    	  } 
...   }] 
... )
{ "acknowledged" : true, "matchedCount" : 6, "modifiedCount" : 6 }
sit_rs1:PRIMARY> db.user.find()
{ "_id" : ObjectId("64b661869be837dc8e997b74"), "name" : "user1", "age" : 10, "letter" : [ { "x" : "X1", "y" : "Y1" }, { "x" : "X2", "y" : "Y2" }, { "x" : "X3", "y" : "Y3" } ], "number" : [ ] }
{ "_id" : ObjectId("64b661869be837dc8e997b75"), "name" : "user2", "age" : 20, "letter" : [ { "V" : "V1", "y" : "Y1" }, { "V" : "V2", "y" : "Y2" }, { "V" : "V3", "y" : "Y3" } ], "number" : [ { "n1" : 7, "n2" : 6 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b76"), "name" : "user3", "age" : 30, "letter" : [ { "V" : "V1", "w" : "W1" }, { "V" : "V2", "w" : "W2" }, { "V" : "V3", "w" : "W3" } ], "number" : [ ] }
{ "_id" : ObjectId("64b661869be837dc8e997b77"), "name" : "user4", "age" : 45, "letter" : [ { "z" : "Z1", "w" : "W1" }, { "z" : "Z2", "w" : "W2" }, { "z" : "Z3", "w" : "W3" } ], "number" : [ { "n1" : 9, "n2" : 8 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b78"), "name" : "user5", "age" : 55, "letter" : [ { "z" : "Z1", "u" : "U1" }, { "z" : "Z2", "u" : "U2" }, { "z" : "Z3", "u" : "U3" } ], "number" : [ { "n1" : 7, "n2" : 8 }, { "n1" : 8, "n2" : 4 } ] }
{ "_id" : ObjectId("64b661869be837dc8e997b79"), "name" : "user6", "age" : 55, "letter" : [ { "t" : "T1", "u" : "U1" }, { "t" : "T2", "u" : "U2" }, { "t" : "T3", "u" : "U3" } ], "number" : [ { "n1" : 8, "n2" : 5 }, { "n1" : 7, "n2" : 6 } ] }

到此这篇关于Mongodb过滤器filter选择要返回的数组子集的文章就介绍到这了,更多相关Mongodb数组子集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MongoDB 数据库的命名、设计规范详解

    MongoDB 数据库的命名、设计规范详解

    随着MongoDB的普及和使用量的快速增长,为了规范使用,便于管理和获取更高的性能,整理此文档
    2020-02-02
  • mongodb数据库入门之CURD简单操作示例

    mongodb数据库入门之CURD简单操作示例

    这篇文章主要介绍了mongodb数据库入门之CURD简单操作,结合简单示例形式分析了MongoDB数据库基本的CURD增删改查相关操作技巧与注意事项,需要的朋友可以参考下
    2019-10-10
  • MongoDB的安装及配置文件选项全解

    MongoDB的安装及配置文件选项全解

    本文收录了MongoDB的安装及配置文件选项全解,介绍了MongoDB安装的方法以及环境下的一些重要文件,还有最重要的是详细地罗列了配置文件中的选项含义和参数,需要的朋友可以参考下
    2016-07-07
  • 解决MongoDB 排序超过内存限制的问题

    解决MongoDB 排序超过内存限制的问题

    最近小编遇到这样的问题:对集合执行一个大排序操作(如聚合),出现以下错误:(测试版本:MongoDB 3.0.6),怎么快速解决此问题呢?下面小编给大家分享MongoDB 排序超过内存限制的解决方法,一起看看吧
    2017-07-07
  • mongodb 修改用户密码 2种方法

    mongodb 修改用户密码 2种方法

    mongodb的用户信息是存放在system.users表中的,修改密码不能直接更新表数据,这样的话,存到表里的密码是明文的,这就不对了。
    2014-07-07
  • MongoDB对数组进行增删改查操作

    MongoDB对数组进行增删改查操作

    与关系型数据库相比,MongoDB支持数组,将数组存储到文档之中,下面这篇文章主要给大家介绍了关于MongoDB对数组进行增删改查操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 阿里云CentOS7安装Mongodb教程

    阿里云CentOS7安装Mongodb教程

    本文给大家介绍的教程主要参考资源的官方文档,当然如果你是centos6的,也可以看看其他文章,笔者用的是7,mongodb想用3以上的版本,需要的小伙伴可以参考下
    2016-11-11
  • MongoDB数据库常用28条查询语句总结

    MongoDB数据库常用28条查询语句总结

    我们经常使用的MySQL是最流行的关系型数据库管理系统,随着时代的进步,互联网的发展关系型数据库已经不满足于互联网的需求,因此出现了非关系数据库,下面这篇文章主要给大家总结介绍了关于MongoDB数据库常用28条查询语句,需要的朋友可以参考下
    2023-05-05
  • mongodb分片技术_动力节点Java学院整理

    mongodb分片技术_动力节点Java学院整理

    这篇文章主要介绍了mongodb分片技术,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • MongoDB入门教程之聚合和游标操作介绍

    MongoDB入门教程之聚合和游标操作介绍

    这篇文章主要介绍了MongoDB入门教程之聚合和游标操作介绍,聚合和游标可以说是MongoDB中的高级操作了,需要的朋友可以参考下
    2014-08-08

最新评论