1

以下のように設計されたコレクションを使用しています。

> 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 はかなり重いと感じています。

ありがとう!

4

0 に答える 0