MongoDB筛选文档并仅返回匹配的子文档(如果存在),否则返回null或空数组或空对象

时间:2018-08-05 09:39:23

标签: mongodb mongoose mongodb-query aggregation-framework

我需要在我的项目中实现搜索/过滤器。我是mongodb的新手。 我需要所有与名称匹配的文档,如果有一个与sID匹配的子文档,则只有该子文档应该在子文档数组中投影。

但是应该显示两个与名称匹配的文档。子文档是否匹配都没关系。

  

我的对象就像:

[
        {
            "name" : "abcd",
            "education" : [
                {"sId" : 3233, "sName" : "XYZ"},
                {"sId" : 3244, "sName" : "SIO"}
            ]
        },
        {
            "name" : "abcd",
            "education" : [
                {"sId" : 3254, "sName" : "HDY"},
                {"sId" : 3245, "sName" : "UYT"}
            ]
        },
        {
            "name" : "qwerty",
            "education" : [
                {"sID" : 2212, "sName" : "SKJ"},
                {"sID" : 2133, "sName" : "SKJ"}
            ]
        },
        {
            "name" : "qwerty",
            "education" : [
                {"sID" : 2322, "sName" : "POS"},
                {"sID" : 1122, "sName" : "POS"}
            ]
        }
    ]
  

当我搜索{“ name”:“ abcd”,“ sID”:3244}

然后输出应为:

[
    {
        "name" : "abcd",
        "education" : [
            {"sId" : 3244, "sName" : "SIO"}
        ]
    },
    {
        "name" : "abcd",
        "education" : []
    }
]

谢谢。

1 个答案:

答案 0 :(得分:1)

我将使用匹配项并在其上带有过滤器的项目与要匹配元素的查询一起使用。

示例:

collection.aggregate([ 
{
    $match: {
    name : "abcd"
    }
},
{ 
    $project :  {
            name :1,
            education: {
              $filter: {
                input: "$education",
                as: "item",
                cond: { $eq: [ "$$item.sId", 3244] }
              }
           }
   }
}
])