首页 > 解决方案 > Mongodb展开数组

问题描述

我有很多文件,比如

{
    "id": 1,
    "name": "a",
    "namespace" : "a",
    "version" : "1.1.1",
    "otherStuff" : ...
    (20 more...)
},
{
    "id": 2,
    "name": "a",
    "namespace" : "a",
    "version" : "2.1.1",
    "otherStuff" : ...
    ...
},
{
    "id": 3,
    "name": "b",
    "namespace" : "a",
    "version" : "1.1.1",
    "otherStuff" : ...
    ...
}

现在我想聚合它,以便我只获得具有最高版本号的文档,按(名称,命名空间)分组。我想出了以下内容,但是我想在我的java代码中使用它,但我无法让它像第一步一样将最后一步解包到整个对象中。

[
{$sort: {
  "version": 1
}},
{$group:  {
        "_id": {
                "name": "$name",
                "namespace": "$namespace"
              },
        "version": { "$last": "$version" },
        "object": { "$last": "$$ROOT" }
}},
 {$sort: {
  "object.namespace": 1,
  "object.name":1
}},
 {$project: {
  object:1,
  _id:0
}}
]

但这给了我:

{ 
  object: [...], 
  object: [...]
}

我正在寻找的是在我的第一个示例中的表示,我只想选择 id 2 和 3。我尝试了 $unwrap 但似乎我用错了,因为它产生的结果与我的 $project 阶段相同。

标签: mongodbnosqlnosql-aggregation

解决方案


您只需要使用$replaceRoot使对象在 Root 中作为最后一个阶段

{
    "$replaceRoot": {
      "newRoot": "$object"
    }
  }

工作Mongo游乐场


推荐阅读