从 MongoDB query/aggregation 管道创建特定形状的结果

Create results of a specific shape from MongoDB query/aggregation pipeline

考虑这个模型:

const user = {
  firstname: { type: String, default: '' },
  lastname: { type: String, default: '' },
  goals: { type: Number, default: 0 },
};

还有这个合集:

[{
  id: 1,
  firstname: 'paul',
  lastname: 'pogba',
  goals: 2,
},
{
  id: 2,
  firstname: 'fred',
  lastname: '',
  goals: 2,
},
{
  id: 3,
  firstname: '',
  lastname: 'rashford',
  goals: 5,
},
{
  id: 4,
  firstname: 'luke',
  lastname: 'shaw',
  goals: 0,
}]

我想执行一个查询(我想它需要是一个聚合管道)returns一个数组,其中每个匹配文档中的每个可用名称都是数组中的一个条目。因此,使用上面的示例,假设我想让用户有 1 个或多个目标。 query/aggregation 管道的最终输出将是:

['paul', 'pogba', 'fred', 'rashford']

注意

我什至不确定 MongoDB 使用的是什么术语,所以也许这就是我找不到正确答案的原因。

我怎样才能做到这一点?谢谢!

  • $match goals 大于 0
  • $group所有文件并准备firstnamelastname数组
  • $project 生成一个 result 数组,$filter 在使用 $concatArrays 连接 firstnamelastname 之后迭代数组循环, 这将删除空字符串 来自数组和 concat 的单个结果
db.collection.aggregate([
  { $match: { goals: { $gt: 0 } } },
  {
    $group: {
      _id: null,
      firstname: { $push: "$firstname" },
      lastname: { $push: "$lastname" }
    }
  },
  {
    $project: {
      _id: 0,
      result: {
        $filter: {
          input: { $concatArrays: ["$firstname", "$lastname"] },
          cond: { $ne: ["$$this", ""] }
        }
      }
    }
  }
])

Playground