【问题标题】:Project first item in an array to new field (MongoDB aggregation)将数组中的第一项投影到新字段(MongoDB 聚合)
【发布时间】:2017-01-04 21:52:27
【问题描述】:

我正在使用 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
  }},

但两者都不起作用。

我怎样才能正确地做到这一点?谢谢

【问题讨论】:

标签: mongodb mongoose aggregation-framework


【解决方案1】:

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

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

你可以使用:

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

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

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

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

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

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

【讨论】:

  • 如何排除匹配项?我的意思是在那之后如何通过0? { $project: { user: { $arrayElemAt: [ "$users", 0 ] }, otherField: 1 }} 或 { $project: { user: { $first: "$users.name" } }
  • @haytham - 在答案中添加了示例。我认为这不能在单个投影中完成($first + 从 first 的结果中排除字段)。
【解决方案2】:

更新:

从 v4.4 开始有一个专门的操作符$first

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

这是语法糖

原答案:

你可以使用arrayElemAt:

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

【讨论】:

  • 如何直接投影数组元素的key? like.. [{ name: 'foo' }] ,我想直接项目名称。
  • @SachinBhandari { $arrayElemAt: [ "$users.key.anotherNestedKey", 0 ] }
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多