Mongodb過(guò)濾器filter選擇要返回的數(shù)組子集操作方法
Mongodb過(guò)濾器
Mongodb使用過(guò)濾器 $filter 根據(jù)指定條件選擇要返回的數(shù)組子集。返回僅包含與條件匹配的元素的數(shù)組。返回的元素按原始順序排列。也就是說(shuō),這個(gè)是選擇你要的文檔,而不是排除。 如果該數(shù)組沒(méi)有符合條件 ,則為 空 []
$filter: 選擇數(shù)組的子集以返回僅包含與過(guò)濾條件匹配的元素的數(shù)組。
插入測(cè)試數(shù)據(jù)
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 具有以下語(yǔ)法:
{ $filter: { input: <array>, as: <string>, cond: <expression> } }
- input: 解析為數(shù)組的表達(dá)式。
- as: 可選的。代表數(shù)組中每個(gè)單獨(dú)元素的變量名稱input。如果未指定名稱,則變量名稱默認(rèn)為this。
- cond: 解析為布爾值的表達(dá)式,用于確定是否應(yīng)將某個(gè)元素包含在輸出數(shù)組中。表達(dá)式使用as中指定的變量名分別引用輸入數(shù)組的每個(gè)元素。
# 以下示例選擇 number 數(shù)組 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: 是可選的。如果未指定名稱,則變量名稱默認(rèn)為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 開(kāi)始,您可以使用聚合管道進(jìn)行更新:使用聚合管道可以實(shí)現(xiàn)更具表現(xiàn)力的更新語(yǔ)句,例如基于當(dāng)前字段值表達(dá)條件更新或使用另一個(gè)字段的值更新一個(gè)字段。
以下示例,使用 filter 選擇數(shù)組的子集, 再更新原來(lái)的數(shù)組。
# 以下示例選擇 number 數(shù)組 n1 字段 僅包含 “大于5” 的文檔:并更新替換原來(lái)的數(shù)組 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 } ] }
到此這篇關(guān)于Mongodb過(guò)濾器filter選擇要返回的數(shù)組子集的文章就介紹到這了,更多相關(guān)Mongodb數(shù)組子集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MongoDB 數(shù)據(jù)庫(kù)的命名、設(shè)計(jì)規(guī)范詳解
隨著MongoDB的普及和使用量的快速增長(zhǎng),為了規(guī)范使用,便于管理和獲取更高的性能,整理此文檔2020-02-02mongodb數(shù)據(jù)庫(kù)入門(mén)之CURD簡(jiǎn)單操作示例
這篇文章主要介紹了mongodb數(shù)據(jù)庫(kù)入門(mén)之CURD簡(jiǎn)單操作,結(jié)合簡(jiǎn)單示例形式分析了MongoDB數(shù)據(jù)庫(kù)基本的CURD增刪改查相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-10-10解決MongoDB 排序超過(guò)內(nèi)存限制的問(wèn)題
最近小編遇到這樣的問(wèn)題:對(duì)集合執(zhí)行一個(gè)大排序操作(如聚合),出現(xiàn)以下錯(cuò)誤:(測(cè)試版本:MongoDB 3.0.6),怎么快速解決此問(wèn)題呢?下面小編給大家分享MongoDB 排序超過(guò)內(nèi)存限制的解決方法,一起看看吧2017-07-07MongoDB對(duì)數(shù)組進(jìn)行增刪改查操作
與關(guān)系型數(shù)據(jù)庫(kù)相比,MongoDB支持?jǐn)?shù)組,將數(shù)組存儲(chǔ)到文檔之中,下面這篇文章主要給大家介紹了關(guān)于MongoDB對(duì)數(shù)組進(jìn)行增刪改查操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05MongoDB數(shù)據(jù)庫(kù)常用28條查詢語(yǔ)句總結(jié)
我們經(jīng)常使用的MySQL是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),隨著時(shí)代的進(jìn)步,互聯(lián)網(wǎng)的發(fā)展關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)不滿足于互聯(lián)網(wǎng)的需求,因此出現(xiàn)了非關(guān)系數(shù)據(jù)庫(kù),下面這篇文章主要給大家總結(jié)介紹了關(guān)于MongoDB數(shù)據(jù)庫(kù)常用28條查詢語(yǔ)句,需要的朋友可以參考下2023-05-05mongodb分片技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了mongodb分片技術(shù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08MongoDB入門(mén)教程之聚合和游標(biāo)操作介紹
這篇文章主要介紹了MongoDB入門(mén)教程之聚合和游標(biāo)操作介紹,聚合和游標(biāo)可以說(shuō)是MongoDB中的高級(jí)操作了,需要的朋友可以參考下2014-08-08