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

6

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

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

是否可以提取/投影/添加数组中一个元素的字段?例如,数组的第一个元素的text字段。我已经尝试了各种不同形式的$addFieldsMongoPlayground中。

db.collection.aggregate([
  {
      $addFields: { text1: '$arr.text' }
  }
]);

但是没有任何东西仅生成一个text字段。最好的情况是,使用上述语法,我得到了两者,但我只想要一个字段,以便在其上使用 $type,因为它似乎$type无法检查数组元素

3个回答

7
您可以使用 $let$arrayElemAt 结合使用,定义临时变量,并引用变量来获取 text 字段:
db.collection.aggregate([
    {
        $addFields: {
            text1: {
                $let: {
                    vars: {
                        first: {
                            $arrayElemAt: [ "$arr", 0 ]
                        }
                    },
                    in: "$$first.text"
                }
            }
        }
    }
])

如何将项目/对象中特定键的所有项添加起来,而不仅仅是第一个? - rom

3

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

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

Mongo Playground


0

我发现的另一个选择是使用first$getField,这是自版本5.0以来的新功能

db.collection.aggregate([
  {
    $addFields: { 
      text1: {
        $getField: {
          field: 'text',
          input: { $first: '$arr' }
        }
      }
    }
  }
]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接