Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

nosql - Mongodb unwrap array

I have a lot of documents like

{
    "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" : ...
    ...
}

Now I want to aggregate this so that I only get the documents with the highest version number, grouped by (name, namespace). I came up with the following, however I want to use it in my java code and I just can't get it to work to unwrap the last step into the whole object like it is in the first step.

[
{$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
}}
]

But this gives me:

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

What I am looking for is the representation like in my first example, I just want to select id 2 and 3. I tried $unwrap but it seems I was using it wrong because it just yielded the same result as my $project stage.

question from:https://stackoverflow.com/questions/65842424/mongodb-unwrap-array

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You just need to use $replaceRoot to make the object to be in Root as a last stage

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

Working Mongo playground


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...