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

时间:2019-06-13 04:03:45

标签: mongodb aggregation-framework

我有一系列包含对象数组的文档:

async function getDNInfo(party) {
    var result = await mongo.findOne({DN:party.user_Number}, "BWUsers");
    return result;
}

是否可以提取/投影/添加该数组中的一个 one 元素字段?例如,数组第一个元素的db.collection.insert({ arr: [ { id: 1, text: 'foo' }, { id: 2, text: 'bar' }, ] }); 字段。我在$addFields中尝试了MongoPlayground的各种变体,

text

,但什么也没有产生一个db.collection.aggregate([ { $addFields: { text1: '$arr.text' } } ]); 字段。充其量,我使用上面的语法得到了两者,但是为了在其上使用$ type,我只想要一个字段,因为它看起来像$type can't inspect array elements

2 个答案:

答案 0 :(得分:1)

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

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

Mongo Playground

答案 1 :(得分:1)

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

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