在MongoDB中获取第一个创建的文档并按字段名分组

在MongoDB中获取第一个创建的文档并按字段名分组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我希望为每个公司创建第一个部门,但是,我对聚合查询感到困惑 文档: [ { _id: "5b7579f2deea1c6e46fd9739", name: "Sales", companyId: "123", }, { _id: "5c5779f1dffe1c6e45df3973", name: "Security", companyId: "123", }, { _id: "5d9759f5ceda1c6e64df9772", name: "H

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

文档:

[
 {
  _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'},
    }
  }
])
我期待这样的结果:

预期结果:

[
 {
  _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'},
    }
  }
])
但我的查询只得到一个结果

实际结果:

[
 {
  _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'},
    }
  }
])
聚合查询:

[
 {
  _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'},
    }
  }
])

您需要按
companyId
字段进行分组,如下所示:

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


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

您的示例文档正确吗?第一个和第二个id值相同,这是禁止的,而且所有文档都有相同的companyId。@SuleymanSah我刚刚发明了id,因为它仅用于示例,所以我将编辑它,谢谢。即使进行了此更新,我也看不到任何预期结果的逻辑,也许您需要调整companyId值,他们都有相同的公司ID这对你有用吗?这将是一个很好的额外的领域,能够排序它像一个日期字段。那个操场是如此酷!你的解决方案也奏效了。我希望我能投票给你作为最好的答案!非常感谢。