2016-10-14 7 views
1

次のデータセットのようなコレクションがあります。これはuseragentsです。文書内を指定されたパラメータでフィルタリングして集計値を取得する方法

useagentsの値の合計額を見つけるためのユースケースがあります。この例では、例としてLinuxとUbuntu OSとしてuseragentsを使用しています。それはダイナミックにすることができます。私の最初のステップとして、集約フレームワークを使用して各ユーザーエージェントの集計値を集計するソリューションが見つかりました。

background questionを参照してください。

ただし、それぞれのパラメータリストに基づいて、それぞれvenuelistssidlistmaclistをチェックして値を集計したいとします。私のデータ構造が複雑になることがあるので、私にとっては非常に難しい問題です。

は、私は、次のパラメータが与えられ、各いるUserAgentのaggreagate合計量(Linuxでは、Ubuntuの)を取得したい:

のParameterList 1

venueid :: [VID001, VID002] // this is compulsory field in parameter list 

    ssids : [SSID001]   // this is optional filed in parameter list 
    mac : [22:22:22:22:22:22] 


    output 

    linux: 12 + 2 = 14 
    ubuntu : 2 + 5 = 7 

のParameterList 2

venueid :: [VID001, VID002] // this is compulsory field in parameter list 

    mac : [22:22:22:22:22:22] // this is optional filed in parameter list 

    output 

    linux: 12 + 4 + 2 = 16 
    ubuntu : 2 + 2 + 5 = 7 

これはサンプルデータセット

です
{ 
     "_id" : ObjectId("57f940c4932a00aba387b0b0"), 
     "tenantID" : 1, 
     "date" : "2016-10-09 00:23:56", 
     "venueList" : [ 
      { 
       "id" : “VID001”, 
       "sum" : [ 
        { 
          "name" : "linux", 
          "value" : 16 
        }, 
        { 
         "name" : "ubuntu", 
         "value" : 7 
        } 
       ], 
       “ssidList” : [ // this is list of ssid’s in venue 
        { 
         "id" : “SSID001”, 
         "sum" : [ 
          { 
           "name" : "linux", 
           "value" : 12 
          }, 
          { 
           "name" : "ubuntu", 
           "value" : 2 
          } 
         ], 
         “macList” : [ // this is mac list inside particular ssid ex: this is mac list inside the SSID1212 
          { 
           "id" : “22:22:22:22:22:22”, 
           "sum" : [ 
            { 
             "name" : "linux", 
             "value" : 12 
            }, 
            { 
             "name" : "ubuntu", 
             "value" : 2 
            } 
           ] 
          } 
         ] 
        }, 
        { 
         "id" : “SSID002”, 
         "sum" : [ 
          { 
           "name" : "linux", 
           "value" : 4 
          }, 
          { 
           "name" : "ubuntu", 
           "value" : 5 
          } 
         ], 
         “macList” : [ // this is mac list inside particular ssid ex: this is mac list inside the SSID1212 
          { 
           "id" : “22:22:22:22:22:22”, // this should be select in parameterlist 02 because there is no ssid selection in parameter list. 
           "sum" : [ 
            { 
             "name" : "linux", 
             "value" : 4 
            }, 
            { 
             "name" : "ubuntu", 
             "value" : 2 
            } 
           ] 
          }, 
          { 
           "id" : “44:44:44:44:44:44”, 
           "sum" : [ 
            { 
             "name" : "linux", 
             "value" : 12 
            }, 
            { 
             "name" : "ubuntu", 
             "value" : 3 
            } 
           ] 
          } 
         ] 
        } 
       ] 
      }, 
      { 
       "id" : “VID002”, 
       "sum" : [ 
        "sum" : [ 
         { 
          "name" : "linux", 
          "value" : 2 
         }, 
         { 
          "name" : "linux", 
          "value" : 5 
         } 

        ], 
       ], 
       "ssidList" : [ 
        { 
         "id" : “SSID001”, 
         "sum" : [ 
          { 
           "name" : "linux", 
           "value" : 2 
          }, 
          { 
           "name" : "linux", 
           "value" : 5 
          } 

         ], 
         "macList" : [ 
          { 
           "id" : “22:22:22:22:22:22”, 
           "sum" : [ 
            { 
             "name" : "linux", 
             "value" : 2 
            } 
            { 
             "name" : "linux", 
             "value" : 5 
            } 
           ] 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    } 

私はこの問題を解決するのを手伝ってください、私はそれを感謝します。私のデータセットに問題がある場合は、それに言及してください。私はMongoDBの新鮮なので、あなたのコメントは私にとってもっと助けになります。

+0

この1つは、あなたに指導を与えることを望みます。http://stackoverflow.com/questions/14568283/mongodb-aggregation-count-array-set-size –

+0

応答ありがとう。私はフィルタ結果が別のパラメータの複数のパラメータにどのように設定されるかに問題があります。 –

+0

この場合、フィルタ結果のネストされたクエリメカニズムが必要です。mongodbでクエリを生成する方法に問題があります –

答えて

1

サンプルクエリ次のように、

このような方法で構造の場合は、getTotal(list venueIds, list ssids , list macs)

if macs!= empty && ssids != empty && venueIds != empty 


db.getCollection('ua').aggregate(
[ 

{$match:{"venueList":{ $elemMatch : { id :{$in: venueIds }}}, 
    "venueList.ssidList":{ $elemMatch : { id :{$in: ssids }}}, 
    "venueList.ssidList.macList":{ $elemMatch : { id :{$in: macs }}} 
}}, 
{ $unwind : "$venueList" }, 
{ $project : { "ssidList" : "$venueList.ssidList"} }, 
{ $unwind : "$ssidList" }, 
{ $project : { "macList" : "$ssidList.macList"} }, 
{ $unwind : "$macList" }, 
{ $project : { "sum" : "$macList.sum"} }, 
{ $unwind : "$sum" }, 

{ 
     $group: 
     { 
      _id: "$sum.name", 
      total: { $sum: "$sum.value" }   
     } 
    } 

] 
) 

if macs == empty && ssids != empty && venueIds != empty 

db.getCollection('ua').aggregate(
[ 

{$match:{"venueList":{ $elemMatch : { id :{$in:venueIds}}}, 
    "venueList.ssidList":{ $elemMatch : { id :{$in:ssids}}} 
}}, 
{ $unwind : "$venueList" }, 
{ $project : { "ssidList" : "$venueList.ssidList"} }, 
{ $unwind : "$ssidList" }, 
{ $project : { "sum" : "$ssidList.sum"} }, 
{ $unwind : "$sum" }, 
{ 
     $group: 
     { 
      _id: "$sum.name", 
      total: { $sum: "$sum.value" }   
     } 
    } 

] 
) 


if macs == empty && ssids = empty && venueIds != empty 

db.getCollection('ua').aggregate(
[ 

{$match:{"venueList":{ $elemMatch : { id :{$in: venueIds}}} 
}}, 
{ $unwind : "$venueList" }, 
{ $project : { "sum" : "$venueList.sum"} }, 
{ $unwind : "$sum" }, 
{ 
     $group: 
     { 
      _id: "$sum.name", 
      total: { $sum: "$sum.value" }   
     } 
    } 
] 
) 

処理するので、多くの文書がある場合、あなたはそのためallowDiskUseを使用することができます。

+0

回答を確認します –

関連する問題