以下のように設計されたコレクションを使用しています。
> db.myCollection.find().pretty();
{
"_id" : ObjectId("524ecedecb5603a47a2cc011"),
"clientId" : ObjectId("524d720d8d3ea014a52e95bb"),
"hostname" : "paypal.com",
"inspections" : [
{
"chainId" : ObjectId("524edb0dcb5666fba519c9f8"),
"isValid" : true,
"date" : ISODate("2013-10-04T15:13:17.634Z")
},
{
"chainId" : ObjectId("524edb0dcb5666fba519c9f8"),
"isValid" : true,
"date" : ISODate("2013-10-04T15:15:56.173Z")
}
],
"name" : "Paypal",
"port" : 443
}
{
"_id" : ObjectId("524edaeecb5624f06c0f2687"),
"clientId" : ObjectId("524d720d8d3ea014a52e95bb"),
"hostname" : "google.com",
"inspections" : [
{
"chainId" : ObjectId("524edb0dcb5666fba519c9f9"),
"isValid" : true,
"date" : ISODate("2012-09-02T14:27:18.674Z")
},
{
"chainId" : ObjectId("524edb0dcb5666fba519c9f9"),
"isValid" : true,
"date" : ISODate("2013-10-04T15:15:56.175Z")
}
],
"name" : "Google",
"port" : 443
}
そして、特定のclientIdについて、コレクションのすべてのエントリを取得したいと思いますがinspections
、最新のものだけを持っていdate
ます。
それを行うために、私はこの集計を使用しています:
db.modules.certificateInspector.sslServices.aggregate(
{$match: {
"clientId": ObjectId("524d720d8d3ea014a52e95bb")
}},
{$unwind: "$inspections"},
{$sort: {"inspections.date": -1}},
{$group: {
"_id": "$_id",
"name": {
"$first": "$name"
},
"inspections": {
"$first": "$inspections"
}
}}
);
そして、それは動作します。
私の唯一の質問は次のとおりです。(パフォーマンスで) もっとうまくやれるでしょうか?
わかりませんが、$sort はかなり重いと感じています。
ありがとう!