mongo 如何筛选子集并展开子集数据

假如有这么一个集合

db.test_tags.insertMany([{
     "_id": "1",
    "tags": [
        {
        lang:'java'
        },
        {
            lang:'c#'
        },
        {
            lang:'c++'
        }
    ]
}])

这时候我想筛选出 lang=java 的数据,我希望返回的结果为

[{
  lang:'java'
}]

可以使用 $elemMatch 操作符实现上述需求:


db.test_tags.find({"tags": {$elemMatch: {lang: 'java'}}})

返回结果:

{ "_id" : "1", "tags" : [ { "lang" : "java" }, { "lang" : "c#" }, { "lang" : "c++" } ] }


如果希望返回的结果仅为符合条件的数组元素,可以使用 $project 操作符进一步筛选:


db.test_tags.aggregate([
    {
        $match: {"tags": {$elemMatch: {lang: 'java'}}}
    },
    {
        $project: {
            "filtered_tags": {
                $filter: {
                    input: "$tags",
                    as: "tag",
                    cond: {$eq: ["$$tag.lang", 'java']}
                }
            }
        }
    }
])

返回结果:

{ "filtered_tags" : [ { "lang" : "java" } ] }


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^