在MongoDB聚合中添加数组元素的字段

Dan*_*scu 6 mongodb aggregation-framework

我有一个包含对象数组的文档集合:

db.collection.insert({
    arr: [
      { id: 1, text: 'foo' },
      { id: 2, text: 'bar' },
    ]
});
Run Code Online (Sandbox Code Playgroud)

有没有办法在该数组中提取/投影/添加一个元素的字段?例如,text数组第一个元素的字段。我已经试过各种变化$ addFieldsMongoPlayground

db.collection.aggregate([
  {
      $addFields: { text1: '$arr.text' }
  }
]);
Run Code Online (Sandbox Code Playgroud)

但没有任何东西只产生一个text领域。充其量,我得到了两个,使用上面的语法,但我只想要一个字段,以便在其上使用 $type,因为它似乎$type无法检查数组元素

mic*_*ckl 7

您可以使用$let$arrayElemAt来定义临时变量,然后引用它来获取text字段:

db.collection.aggregate([
    {
        $addFields: {
            text1: {
                $let: {
                    vars: {
                        first: {
                            $arrayElemAt: [ "$arr", 0 ]
                        }
                    },
                    in: "$$first.text"
                }
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)


Dan*_*scu 3

提取数组元素的字段的一种方法是$arrayElemAt$project阶段中使用投影第一个元素,然后访问所需的字段,例如text,在第二$project阶段:

db.collection.aggregate([
  {
    $project: {
      elem1: {
        $arrayElemAt: ["$arr", 0]
      }
    }
  },
  {
    $project: {
      text1: "$elem1.text"
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

蒙戈游乐场