将数组中的第一项投影到新字段(MongoDB 聚合)

我正在使用 Mongoose 聚合(MongoDB 版本3.2)。

我有一个字段 users,它是一个数组。我想 $project在这个数组中的第一个项目到一个新的字段 user

我尽力了

  { $project: {
user: '$users[0]',
otherField: 1
}},


{ $project: {
user: '$users.0',
otherField: 1
}},


{ $project: {
user: { $first: '$users'},
otherField: 1
}},

但都不管用。

我怎样才能做得正确? 谢谢

57908 次浏览

更新:

从 v4.4开始,有一个专用的操作员 $第一:

{ $project: {
user: { $first: "$users" },
otherField: 1
}},

这是一种语法糖

原答案:

你可以使用 数组元素:

{ $project: {
user: { $arrayElemAt: [ "$users", 0 ] },
otherField: 1
}},

Mongo 4.4开始,聚合运算符 $first可用于访问数组的第一个元素:

// { "users": ["Jean", "Paul", "Jack"] }
// { "users": ["Claude"] }
db.collection.aggregate([
{ $project: { user: { $first: "$users" } } }
])
// { "user" : "Jean" }
// { "user" : "Claude" }

如果它是一个对象数组,而你只想使用一个对象字段,例如:

{
"users": [
{name: "John", surname: "Smith"},
{name: "Elon", surname: "Gates"}
]
}

你可使用:

{ $project: { user: { $first: "$users.name" } }

编辑 (从@haytham 中排除 case-after 注释)

为了从嵌套的数组文档中排除一个字段,你必须做两个投影:

 { $project: { user: { $first: "$users" } }

返回整个第一个对象,然后排除你不想要的字段,即:

{ $project: { "user.name" : 0 }