Mongodb Mongo聚合和过滤器

Mongodb Mongo聚合和过滤器,mongodb,aggregation,Mongodb,Aggregation,我正在尝试使用以下查询筛选文档: db.projects.aggregate([ { $project: { deployments: { $filter: { input: "$releases.deployments", as: "deployment", cond: { $eq: [

我正在尝试使用以下查询筛选文档:

db.projects.aggregate([
    {
        $project: { 
            deployments: { 
                $filter: { 
                    input: "$releases.deployments", 
                    as: "deployment", 
                    cond: { $eq: ["$$deployment.environment", "Live"] }
                }
            }
        }
    }
])
deployments
的输出总是一个空数组,尽管如果我将条件更改为
$ne
,它将返回所有结果

如何使筛选条件仅返回
deployment.environment
等于字符串
Live
的记录

下面是一个json示例:

{
      "project_id": "1",
      "project_group": "A",
      "releases": [
        {
          "version": "1",
          "deployments": [
            {
              "environment": "Integration",
              "created": "2019-10-01T06:40:01.000Z",
              "state": "Success",
              "name": "Deploy to Integration"
            },
            {
              "environment": "Test",
              "created": "2019-10-01T08:23:58.000Z",
              "state": "Success",
              "name": "Deploy to Test"
            },
            {
              "environment": "Live",
              "created": "2019-10-01T09:02:17.000Z",
              "state": "Success",
              "name": "Deploy to Live"
            }
          ]
        }
      ]
    }

如果
发行版
是一个嵌入文档,但它是一个嵌入文档数组,那么您的查询将非常有效。

下面的查询将迭代
发布
的每个元素,并筛选环境为
实时
的部署

db.collection.aggregate([
    {
        $project:{
            "releases":{
                $map:{
                    "input":"$releases",
                    "as":"release",
                    "in":{
                        $mergeObjects:[
                            "$$release",
                            {
                                "deployments":{
                                    $filter:{
                                        "input":"$$release.deployments",
                                        "as":"deployment",
                                        "cond":{
                                            $eq:["$$deployment.environment","Live"]
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    },
    {
        $project:{
            "releases":{
                $filter:{
                    "input":"$releases",
                    "as":"release",
                    "cond":{
                        $ne:["$$release.deployments.0",null]
                    }
                }
            }
        }
    }
]).pretty()
输出:

{
    "_id" : ObjectId("5d93401ef2e6411a68a145ee"),
    "releases" : [
        {
            "version" : "1",
            "deployments" : [
                {
                    "environment" : "Live",
                    "created" : "2019-10-01T09:02:17.000Z",
                    "state" : "Success",
                    "name" : "Deploy to Live"
                }
            ]
        }
    ]
}
尝试下面的聚合:

db.projects.aggregate([
  {
    $unwind: "$releases"
  },
  {
    $project: {
      version: "$releases.version",
      deployments: {
        $filter: {
          input: "$releases.deployments",
          as: "deployment",
          cond: {
            $eq: [
              "$$deployment.environment",
              "Live"
            ]
          }
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      releases: {
        $push: {
          deployments: "$deployments",
          version: "$version"
        }
      }
    }
  }
])

在项目开始前先释放,然后在项目结束后再分组。你能给我举个例子吗?@Neil How it’s duplicate of?@Mr.s.Sharma这是一个非常清晰的副本。“过滤嵌入式阵列”正是这个问题所要问的。OP应该阅读它,以了解它实际上是如何完成的,并考虑到所有条件。你甚至可以自己在那里学到一些东西。这很管用,但它也包括很多空记录,例如:{“部署”:[],“版本”:“1.0.66.63”}如何将这些记录排除在结果集中?我们只需要在空部署上添加一个过滤器。让我更新查询。更新查询。谢谢,我仍然有空记录,但我比10分钟前的位置提前了100英里,当时我正在检查同一份文档,并试图找出我没有结果的原因!