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
的不包含)。mongodb
方法一:使用$unwind
將addrs
數組打散,獲取結果集後用$match
篩選符合條件的數據,最後使用$group
進行聚合獲取最終結果集。
db.getCollection('user').aggregate( [ { $unwind: "$addrs" }, { $match : { "uid":"1000001", "addrs.is_query": "1" } }, { $group : { "_id" : "$uid", "addrs": { $push: "$addrs" } } } ] )
Result:json
{ "_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
就很是合適了。