首页 > 解决方案 > 项目嵌入文档键值,基于 mongoDB 聚合中的条件

问题描述

我有一个名为tickets的mongo集合,我们将ticket详细信息存储在类似的结构文档中,如下所示:

    [
      {
        "status": "PAUSED",
        "lifecycle_dates": {
          "OPEN": "d1",
          "CLOSED": "d2",
          "PAUSED": "d3"
        }
      },
      {
        "status": "OPEN",
        "lifecycle_dates": {
          "OPEN": "d1",
          "PAUSED": "d3"
        }
      },
      {
        "status": "CLOSED",
        "lifecycle_dates": {
          "OPEN": "d1",
          "CLOSED": "d2"
        }
      }
    ]

我需要获取显示票证当前状态和状态日期的数据。

我想投影数据,例如:

[
  {
    "status": "PAUSED",
    "lifecycle_date": "d3"
  },
  {
    "status": "OPEN",
    "lifecycle_date": "d1"
  },
  {
    "status": "CLOSED",
    "lifecycle_date": "d2"
  }
]

如何根据 mongo 聚合管道中的当前状态预测单个生命周期日期?像这样的东西:

{
    $project : {
        "status" : 1,
        "lifecycle_date" : $lifecycle_dates[$status]
    }
}

在此处的 mongo 参考文档中找不到任何参考或类似问题

当前的mongo版本:3.2

标签: mongodbmongodb-queryaggregation-framework

解决方案


更新答案:

由于您需要按 获取date,因此status可以使用此聚合查询:

db.test.aggregate([ 
{
    $project : {
        _id : 0,
        status : 1,
        lifecycle_date : { $cond: [ {$eq : ["$status","OPEN"]}, "$lifecycle_dates.OPEN", { $cond: [ {$eq : ["$status","CLOSED"]}, "$lifecycle_dates.CLOSED", { $cond: [ {$eq : ["$status","PAUSED"]}, "$lifecycle_dates.PAUSED", "-1" ]} ]} ]}
    }
}]) 

这也与 Mongo 3.2 兼容。

输出 :

{ "status" : "PAUSED", "lifecycle_date" : "d3" }
{ "status" : "OPEN", "lifecycle_date" : "d1" }
{ "status" : "CLOSED", "lifecycle_date" : "d2" }

==================================================== ========================

这个答案是针对上一个问题的——

使用此聚合:

db.test.aggregate([
{
    $project : {
        _id : 0,
        status : 1,
        lifecycle_date : "$lifecycle_dates.PAUSED"
    }
}
])

输出 :

{ "status" : "PAUSED", "lifecycle_date" : "d3" }

推荐阅读