首页 > 解决方案 > 在 MongoDB 中获取第一个创建的文档并按字段名分组

问题描述

我想为每家公司创建第一个部门,但是,我对聚合查询感到困惑。

文件:

[
 {
  _id: "5b7579f2deea1c6e46fd9739",
  name: "Sales",
  companyId: "123",
 },
 {
   _id: "5c5779f1dffe1c6e45df3973",
   name: "Security",
   companyId: "123",
 },
 {
   _id: "5d9759f5ceda1c6e64df9772",
   name: "Human Resource",
   companyId: "789",
 },
]

我期待这样的结果:

预期结果:

[
 {
  _id: "5b7579f2deea1c6e46fd9739",
  name: "Sales",
  companyId: "123",
 },
 {
   _id: "5d9759f5ceda1c6e64df9772",
   name: "Human Resource",
   companyId: "789",
 },
]

但是我的查询只得到一个结果。

实际结果:

[
 {
  _id: "5b7579f2deea1c6e46fd9739",
  name: "Sales",
  companyId: "123",
 },
]

聚合查询:

db.getCollection('departments').aggregate([
  {
    $sort:{ item: 1 }
  },
  {
    $group: {
        _id:'$item',
      companyId: { $first:'$companyId'},
      name: { $first:'$name'},
    }
  }
])

标签: mongodbmongodb-queryaggregation-framework

解决方案


您需要像这样按companyId字段分组:

db.departments.aggregate([
  {
    $group: {
      _id: "$companyId",
      doc: {
        $first: "$$ROOT"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$doc"
    }
  }
])

操场

如果您有像日期字段这样的自然排序字段,那么最好在小组赛阶段之前对该字段应用排序阶段。


推荐阅读