1

私のコレクションには、このタイプのドキュメントがあります。バージョンを持つ多くのコンポーネントを保存します。

{
   "_id" : "compagny/component_name/2.3.3",
   "type" : "action",
   "owner" : "compagny",
   "name" : "component_name",
   "version" : "2.3.3",
   "splitVersion" : {
      "major" : 2,
      "minor" : 3,
      "patch" : 3 },
    "jar" : "url...myArtifact.jar",
    "timestamp" : ISODate("2014-10-16T14:25:22.954Z"),
    "artifactKey" : "artifact-loadsupport/2.3.3"

}

コンポーネントの最新バージョンを取得する方法を探しています。つまり、同じ所有者/名前を持つすべてのコンポーネントの最新バージョンを取得します。

この集計で結果を得ることができますが、結果は整形式ではありません:

db.components.aggregate(   
{$sort: {type : 1, owner : 1, name : 1, "splitVersion.major" : -1, "splitVersion.minor": -1, "splitVersion.patch" : -1} },   
{$group: { _id: {owner:"$owner", name : "$name"}, version: { $first: "$version" }}}
)

この集計で結果を取得できますが、完全なドキュメントを返すにはどうすればよいですか? (.find() と同じ)

データを Jongo でマップしているため、この集計結果を処理するのは簡単ではありません...結果はドキュメント クラスにマップされません。手動でearth値をバインドする必要があります...

ありがとう

4

1 に答える 1

1

これを行うには、 https://stackoverflow.com/a/16662878/1333610で提案されているものを使用できます$project

db.components.aggregate(   
{ $sort: {type : 1, 
          owner : 1, 
          name : 1, 
          "splitVersion.major" : -1, 
          "splitVersion.minor": -1, 
          "splitVersion.patch" : -1
         } 
},
{$group: { _id: {owner:"$owner", name : "$name"}, 
            version: { $first: "$version" },
            splitVersion: { $first: "$splitVersion" },
            jar: { $first: "$jar" }
            // similarly add all the fields in your doc with $first
          }
},
{$project: {_id: 0, 
             owner: "$_id.owner", 
             name: "$_id.name", 
             version: 1, 
             splitVersion: 1, 
             jar: 1
             // add all the fields you want here
            } 
}
)

これ$firstは、最初のフィールドの最初の一致に対応するフィールドを格納するため、つまりversionあなたの場合に機能します。

于 2014-10-16T22:56:14.993 に答える