【问题标题】:Transforming Array values in MongoDB在 MongoDB 中转换数组值
【发布时间】:2021-03-18 10:32:35
【问题描述】:

我是 MongoDB 的新手,在这里我试图用给定的数据转换每个文档中的数据。 请帮我完成这项任务。

getconvagregate1 集合:(现有)

 {
            "_id" : ObjectId("603faf38150786680421b52b"),
            "conversationMetricName" : [
                    {
                            "metric" : "nConnected",
                            "stats" : {
                                    "count" : 3
                            }
                    },
                    {
                            "metric" : "tAbandon",
                            "stats" : {
                                    "max" : 319012,
                                    "min" : 7372,
                                    "count" : 1,
                                    "sum" : 326384
                            }
                    },
                    {
                            "metric" : "tAcd",
                            "stats" : {
                                    "max" : 319012,
                                    "min" : 7372,
                                    "count" : 1,
                                    "sum" : 326384
                            }
                    }
            ],
            "conversationInterval" : "2021-02-17T18:30:00.000Z/2021-02-18T18:30:00.000Z",
            "__v" : 0
    }
{
        "_id" : ObjectId("603faf38150786680421b52b"),
        "conversationMetricName" : [
                {
                        "metric" : "nConnected",
                        "stats" : {
                                "count" : 19
                        }
                },
                {
                        "metric" : "tAbandon",
                        "stats" : {
                                "max" : 319012,
                                "min" : 7372,
                                "count" : 2,
                                "sum" : 326384
                        }
                }
                
        ],
        "conversationInterval" : "2021-02-18T18:30:00.000Z/2021-02-19T18:30:00.000Z",
        "__v" : 0
}

所需的收集数据:

这里我需要与“metric”的值进行比较,并需要相应地选择“Count”。如果假设某个指标不存在,我需要将其映射为“0”值。

{
        "_id" : ObjectId("60468a01010e8f08b0f794d6"),
        "conversationInterval" : "2021-02-17T18:30:00.000Z/2021-02-18T18:30:00.000Z",
        "nConnected":3
        "tAbandon":1,
        "tAcd":1
        "__v" : 0
}      
{
        "_id" : ObjectId("60468a01010e8f08b0f794d7"),
        "conversationInterval" : "2021-02-18T18:30:00.000Z/2021-02-19T18:30:00.000Z",
        "nConnected":19
        "tAbandon":2,
        "tAcd":0
        "__v" : 0
}

【问题讨论】:

    标签: node.js arrays mongodb mongoose


    【解决方案1】:

    这是一个使用 $arrayToObject$replaceRoot 聚合的解决方案

    db.collection.aggregate([
      {
        "$project": {
          "_id": 1,
          "__v": 1,
          "conversationInterval": 1,
          "metrics": {
            "$arrayToObject": {
              "$map": {
                "input": "$conversationMetricName",
                "as": "el",
                "in": {
                  "k": "$$el.metric",
                  "v": "$$el.stats.count"
                }
              }
            }
          }
        }
      },
      {
        "$replaceRoot": {
          "newRoot": {
            "$mergeObjects": [
              "$metrics",
              "$$ROOT"
            ]
          }
        }
      },
      {
        "$project": {
          "metrics": 0
        }
      }
    ])
    

    试试看here

    【讨论】:

    • 非常感谢您的帮助。我只需要一个建议,如果假设指标 -tAcd 需要显示为 0,当前为“nConnected”:19,“tAbandon”:2,但缺少“tAcd”:0。根据现有数据,是否可以将缺失值显示为 0 。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2021-02-21
    • 2021-03-11
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多