【问题标题】:Project embedded document key value, based on condition in mongoDB aggregation项目嵌入文档键值,基于 mongoDB 聚合中的条件
【发布时间】:2018-12-31 18:27:55
【问题描述】:

我有一个名为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 reference document here中找不到任何参考或类似问题

当前 mongo 版本:3.2

【问题讨论】:

  • 在这里使用$project...[{$project:{status:1,lifecycle_date:'$lifecycle_dates.PAUSED'}}]
  • @AnthonyWinzlet 抱歉问题之前不清楚,我已经更新了。你能再看看吗?

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

你可以试试下面的聚合

db.collection.aggregate([
  { "$project": {
    "status": 1,
    "lifecycle_date": {
      "$arrayElemAt": [
        { "$filter": {
          "input": { "$objectToArray": "$lifecycle_dates" },
          "as": "life",
          "cond": { "$eq": ["$$life.k", "$status"] }
        }},
        0
      ]
    }
  }},
  { "$project": {
    "status": 1,
    "lifecycle_date": "$lifecycle_date.v"
  }}
])

【讨论】:

  • 感谢您的回复,似乎应该这样,但是 $objectToArray 不存在于 mongo 3.2 有没有办法在 v3.2 中做到这一点?
  • 是的,您必须升级到 3.6 或更高版本才能使用它...在这里查看 mongoplayground.net/p/X3lQ43Xkj5i
【解决方案2】:

更新答案:

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

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" }

【讨论】:

  • 问题是我不知道当前状态是什么,可能有三种状态'OPEN'、'CLOSED'和'PAUSED',它们各自的日期存储在一个名为'lifecycle_dates'的对象中.在检索时,我只想要基于当前状态的生命周期日期。
  • 我已经更新了我的答案,根据您的更新,请验证。它与 Mongo 3.2 兼容。
【解决方案3】:
db.tickets.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $project: {
                "status": 1,
                _id: 0,
                "lifecycle_dates": {
                    $switch: {
                        branches: [{
                                case: {
                                    $eq: ["$status", "PAUSED"]
                                },
                                then: "$lifecycle_dates.PAUSED"
                            },
                            {
                                case: {
                                    $eq: ["$status", "OPEN"]
                                },
                                then: "$lifecycle_dates.OPEN"
                            },
                            {
                                case: {
                                    $eq: ["$status", "CLOSED"]
                                },
                                then: "$lifecycle_dates.OPEN"
                            }
                        ],

                    }
                }
            }
        },
    ])

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 2013-09-18
    • 1970-01-01
    • 2017-07-31
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多