首页 > 解决方案 > MongoDB 数组中的 $project

问题描述

我有items以下文档的 MongoDB 集合:

{
    data: [{"name": "First"}, {"name": "Second"}],
    data2: [{"value": 20}, {"value": 30}]
}

有什么办法可以投射data2.valuedata.value相同的索引上?我需要这个结果:

{
    data: [
        {"name": "First", value: 20},
        {"name": "Second", value: 30}
    ]
}

它想要这样的东西:

db.items.aggregate([{"$project": {"data.X.value": "$data2.X.value", "data2": 0}}]) // Where X "iterate" over all indexes (so 0 and 1).

数组的长度datadata2总是相同的,但不一定是 2。

标签: mongodb

解决方案


你可以试试,

  • $mapdata数组对象循环遍历对象
  • $indexOfArray获取当前对象的索引$$d
  • $arrayElemAt从特定对象索引value中获取元素data2$$d
db.collection.aggregate([
  {
    $project: {
      data: {
        $map: {
          input: "$data",
          as: "d",
          in: {
            name: "$$d.name",
            value: {
              $arrayElemAt: [
                "$data2.value",
                { $indexOfArray: ["$data", "$$d"] }
              ]
            }
          }
        }
      }
    }
  }
])

游乐场:https ://mongoplayground.net/p/wv1vEVsrHeT


推荐阅读