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数组子集内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论