【问题标题】:Aggregate string values to array of unique string values per field with mongo or mongoose and node.js使用 mongo 或 mongoose 和 node.js 将字符串值聚合到每个字段的唯一字符串值数组
【发布时间】:2020-06-11 09:57:19
【问题描述】:

我需要汇总“姓名”的“姓氏”和“职业”以获得结果:

{
  name: 'John',
  occupations: ['software engineer', 'qa']
  lastNames: ['Smith', 'Red', 'Doe']
}

输入

name: 'John'

mongo 中存在的文档:

{name: 'John', lastName: 'Smith', occupation: 'software engineer'}
{name: 'Steve', lastName: 'Smith', occupation: 'senior software engineer'}
{name: 'John', lastName: 'Doe', occupation: 'qa'}
{name: 'Steve', lastName: 'Doe', occupation: 'manager'}
{name: 'John', lastName: 'Red', occupation: 'software engineer'}

我从这个聚合查询开始:

Employees.aggregate([
  { $match: { name: name } },
  {
    $unwind: {
      path: '$lastName',
    },
  },
  {
    $unwind: {
      path: '$occupation',
    },
  },
  { $group: { _id: '$name' } },
]);

但这会返回一个空数组,所以我有点卡住了,因为我以前从未做过聚合。

有没有办法产生这个所需的结果?

【问题讨论】:

  • 您的文档不包含任何数组,因此$unwind 没用

标签: mongodb mongoose mongodb-query aggregation-framework aggregate


【解决方案1】:

会是这个:

db.collection.aggregate([
   { $match: { name: "John" } },
   {
      $group: {
         _id: "$name",
         occupations: { $addToSet: "$occupation" },
         lastNames: { $addToSet: "$lastName" },
      }
   },
   {
      $project: {
         _id: 0,
         name: "$_id",
         occupations: 1,
         lastNames: 2
      }
   }
])

Mongo playground

【讨论】:

  • 所以职业和姓氏将只包含唯一值?
  • 只需阅读文档:$addToSet 运算符将值添加到数组中,除非该值已经存在,在这种情况下 $addToSet 对该数组没有任何作用。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多