【问题标题】:extract the information from array key and update the objects of the arrays in mongoDB从数组键中提取信息并更新 mongoDB 中数组的对象
【发布时间】:2021-09-13 13:31:41
【问题描述】:

说明:从info 数组k 键中提取信息,并使用从k 中提取的信息更新数组。检查输出文件。

info 的逻辑是:

       "info":{ 
        "$filter" : {
             "input" : "$info",
             "as" : "p",
             "cond" : {
                "$and" : [
                   { "$ne" : [ "$$p.v", "-" ] }
                ]
             }
          }
      }

文档 1:

{
"info": [
    {
      "k": "2_3_4",
      "v": 0
    },
    {
      "k": "254_0_2",
      "v": 3
    }
  ]
}

预期输出:

{
"info": [
    {
      "A": 2,
      "B": 3,
      "C": 4,
      "k": "2_3_4",
      "v": 0
    },
    {
      "A" :24,
      "B" :2,
      "C": "NA",
      "k": "24_2",
      "v": 3
    }
  ]
}

【问题讨论】:

  • 没有对象可以是那种结构,对象有键有值obj = {a:b,c:d},什么意思?
  • 感谢您提出问题,我刚刚更新了输出。我忘了提。
  • 一个对象上不能有相同的键。
  • 是的,如前所述,这不是一个好的对象形状。充其量您将无法访问三个键值对中的两个。在最坏的情况下,您将无法创建这样的对象。
  • 是的,我同意你的 cmets。我用预期的输出更新了我的问题。感谢您的参与,给了我正确的方向。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:
  • $map 迭代 info 数组的循环
  • $split 用“_”分割k 字符串
  • $arrayElemAt 从拆分结果数组中获取特定元素
  • $ifNull检查上述操作的返回结果是否为null,然后返回“NA”
  • $let 声明一个变量 k 来存储拆分结果,并在 in 中为“A”、“B”和“C”处理运算符
  • $mergeObjects 合并 info 对象的当前对象和更新的新属性对象
db.collection.aggregate([
  {
    $project: {
      info: {
        $map: {
          input: "$info",
          as: "i",
          in: {
            $mergeObjects: [
              "$$i",
              {
                $let: {
                  vars: {
                    k: { $split: ["$$i.k", "_"] }
                  },
                  in: {
                    A: {
                      $ifNull: [{ $arrayElemAt: ["$$k", 0] }, "NA"]
                    },
                    B: {
                      $ifNull: [{ $arrayElemAt: ["$$k", 1] }, "NA"]
                    },
                    C: {
                      $ifNull: [{ $arrayElemAt: ["$$k", 2] }, "NA"]
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多