如何组合聚合查询 - mongoDB?

时间:2014-06-19 07:24:46

标签: mongodb

我有以下mongoDB文档

{
"location" : {
              "language" : null,
              "country" : "null",
              "city" : "null",
              "state" : null,
              "continent" : "null",
              "latitude" : "null",
             "longitude" : "null"
           },
"request" : [
             {
               "referrer" : "direct",
               "url" : "http://www.google.com/"
               "title" : "index page"
               "currentVisit" : 1401282897
               "visitedTime" : 1401282905
             },

             {
              "referrer" : "direct",
              "url" : "http://www.stackoverflow.com/",
              "title" : "index page"
              "currentVisit" : 1401282900
              "visitedTime" : 1401282905
             },
           ......
           ]
"uuid" : "109eeee0-e66a-11e3"

}

我有四个聚合查询。

  1. 首先查询:

    [
     { "$match":{
              "request.1": {$exists:true}
     }},
     { "$match": { "request.currentVisit":{ 
            "$gte":1401282905, "$lte": 1401282985
     }}},
     { "$unwind": "$request" },
     { "$group": { 
          "_id": {
             "url":"$request.url"
      },
     "count": { "$sum": 1 }
     }},
    { "$sort":{ "count": -1 } }
    ]
    
  2. 第二次查询:

     [
       { "$match": {  
              "request":{ "$size": 1 }
       }},
       { "$match": { "request.currentVisit":{ 
            "$gte":1401282905, "$lte": 1401282985
       }}},
       { "$unwind": "$request" },
       { "$group": {
             "_id":{ 
                "url":"$request.url"
       },
       "count":{ "$sum": 1 }
       }},
       { "$sort": { "count": -1} }
      ]
    
  3. 3.第三次查询:

             [
             { "$match":{
                "request.1": { "$exists": true } 
             }},
             { "$match": { "request.currentVisit":{ 
                   "$gte":1401282905, "$lte": 1401282985
             }}},
             { "$group": {
                  "_id": "$uuid",
                  "count":{ "$sum": 1 }
             }},
             { "$group": {
                 "_id": null,
                 "total": { "$sum":"$count" }}
             }}
            ]
    
    1. 第四次质疑:

         [
          { "$match":{
              "request":{ "$size": 1 }
          }},
          { "$match": { "request.currentVisit":{ 
              "$gte":1401282905, "$lte": 1401282985
          }}},
         { "$group": {
                "_id":"$uuid",
                "count":{ "$sum": 1 }
          }},
          { "$group": {
               "_id":null,
               "total": { "$sum": "$count" }
          }}
         ]
      
    2. 注意:

      1. 技术/编程 - Node.js

      2. 相同的数据库和相同的集合

      3. 查询之间的区别:

        首次查询只会获取request size 1

        的结果

        第二次查询只会获取request size多个结果。

        第三和第四个相同。

        是否可以将上述四个聚合查询转换为单个查询以提高性能?

0 个答案:

没有答案