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

Hon*_*iao 26 mongoose mongodb aggregation-framework

我正在使用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
  }},
Run Code Online (Sandbox Code Playgroud)

但都不起作用.

我该怎么做才能正确?谢谢

Ale*_*lex 72

你可以使用arrayElemAt:

{ $project: {
    user: { $arrayElemAt: [ "$users", 0 ] },
    otherField: 1
}},
Run Code Online (Sandbox Code Playgroud)

  • 我们怎样才能直接投射数组元素的键?比如... [{name:'foo'}],我想直接投影名称. (8认同)
  • @SachinBhandari { $arrayElemAt: [ "$users.key.anotherNestedKey", 0 ] } (8认同)

Xav*_*hot 9

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

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


Mic*_*rek 6

如果它是一个对象数组并且您只想使用单个对象字段,即:

{
 "users": [
    {name: "John", surname: "Smith"},
    {name: "Elon", surname: "Gates"}
   ]
}
Run Code Online (Sandbox Code Playgroud)

您可以使用:

{ $project: { user: { $first: "$users.name" } } 
Run Code Online (Sandbox Code Playgroud)

编辑(排除大小写 - 来自@haytham 的评论后)

为了从数组中的嵌套文档中排除单个字段,您必须进行 2 次投影:

 { $project: { user: { $first: "$users" } } 
Run Code Online (Sandbox Code Playgroud)

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

{ $project: { "user.name" : 0 } 
Run Code Online (Sandbox Code Playgroud)