mongodb如何對文檔內數組進行過濾

clipboard.png

mongodb文檔內包含數組,須要將數組中符合條件的數據過濾出來並返回結果集,能夠用兩種方式來查詢 groupfilter
數據源:
{
    "_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


查詢語句:
方法一:使用 $unwindaddrs數組打散,獲取結果集後用 $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就很是合適了。
相關文章
相關標籤/搜索