2016-06-22 51 views
2

我> 8000条记录中我的数据库,这是其中的一个:的MongoDB,PyMongo - 骨料与find条件

{ 
    "_id" : ObjectId("57599c498c39598eafb781b9"), 
    "_class" : "vn.cdt.entity.db.AccessLog", 
    "url" : "/shop/huenguyenshop/browse", 
    "ip" : "10.0.0.238", 
    "sessionId" : "86E5CF8E6D465A6EDFE7C9BF7890AA4B", 
    "oldSessionId" : "86E5CF8E6D465A6EDFE7C9BF7890AA4B", 
    "cookie" : "{\"sessionId\":\"86E5CF8E6D465A6EDFE7C9BF7890AA4B\",\"objects\":[{\"id\":\"903815555908\",\"type\":\"VIEW_SHOP\",\"count\":1}]}", 
    "isCookie" : true, 
    "createTime" : NumberLong(1464935913641), 
    "objectId" : "903815555908", 
    "type" : "VIEW_SHOP" 
} 

我想要做什么:

我想找到所有记录有相同的oldSessionIdtype: VIEW_ITEMtype: BUY_ITEM)和createTime最新

我曾试图:

pipeline = ([ 
       {"$group" : { "_id": "$oldSessionId", "count": { "$sum": 1 } }}, 
       {"$match": {"count" : {"$gt": 1} } }, 
       {"$project": {"oldSessionId" : "$_id", "_id" : 0} } 
      ]) 

但是pipeline给我只能sessionId

find({'createTime': {'$lt':1464419127000, '$gt':1464332727000}, 
'$or':[{'type':'BUY_ITEM'},{'type':'VIEW_ITEM'}]}) 

find给我的所有记录与type: VIEW_ITEMtype: BUY_ITEM在特定的时间。

我不知道如何添加与typecreateTime过滤器得到我想要的。

更新 感谢@chridam对我的帮助:

如果我想添加特定日期的聚集,我可以添加这样的查询:

pipeline = \ 
    (
     [ 
      { "$match": { 
         "createTime": {"$lt":1464419127000, "$gt":1464332727000 }, 
         "type": { "$in": ["VIEW_ITEM", "BUY_ITEM"] } 
         } 
      }, 
      { "$sort": { "createTime": -1, "oldSessionId": 1 } }, 
      { 
       "$group": 
        { "_id": "$oldSessionId", 
         "_class": { "$first": "$_class" }, 
         "url": { "$first": "$url" }, 
         "ip": { "$first": "$ip" }, 
         "sessionId": { "$first": "$sessionId" }, 
         "oldSessionId": { "$first": "$oldSessionId" }, 
         "cookie": { "$first": "$cookie" }, 
         "isCookie": { "$first": "$isCookie" }, 
         "createTime": { "$first": "$createTime" }, 
         "objectId": { "$first": "$objectId" }, 
         "type": { "$first": "$type" }, 
        } 
      } 

     ] 

    ) 

回答

1

要获得所有具有文档(类型:VIEW_ITEM或类型:BUY_ITEM)并且createTime是最新的,则需要进行具有以下角色(阶段)的聚合管道展示:

  1. $match阶段:

    • 这将筛选有一个类型要么VIEW_ITEMBUY_ITEM的所有文件。您可以在查询中使用$in$in操作符,因为它允许您选择type字段的值等于指定数组的任何值的文档,这恰好是具有两个可能类型值(即["VIEW_ITEM", "BUY_ITEM"])的列表。
  2. $sort阶段

    • 这将提供从以前的管道的文件(以上)进行订购。这是必要的,因为您想要在最新的createTime字段中汇总这些过滤文档。
  3. $group阶段

    • 在这最后一步,你组中的所有文件,下令由oldSessionId键,添加要使用$first运营商领域。

凑合上述所有管道一起形成以下聚集管道:

pipeline = [ 
    { "$match": { "type": { "$in": ["VIEW_ITEM", "BUY_ITEM"] } } }, 
    { "$sort": { "createTime": -1, "oldSessionId": 1 } }, 
    { 
     "$group": { 
      "_id": "$oldSessionId", 
      "_class": { "$first": "$_class" }, 
      "url": { "$first": "$url" }, 
      "ip": { "$first": "$ip" }, 
      "sessionId": { "$first": "$sessionId" }, 
      "cookie": { "$first": "$cookie" }, 
      "isCookie": { "$first": "$isCookie" }, 
      "createTime": { "$first": "$createTime" }, 
      "objectId": { "$first": "$objectId" }, 
      "type": { "$first": "$type" }, 
     } 
    } 
] 
+0

你又帮我解决我的问题。非常感谢你@chridam。 '“cookie”::{“$ first”:“$ cookie”}'在“cookie”之后有两个“:”。 '“cookie”:{“$ first”:“$ cookie”}'。如果我把'.count()'放在'aggregate(pipeline)'后显示错误'TypeError:db.getCollection(...)。aggregate(...)。count不是函数: @(shell): 1:1'我可以在聚合后查看记录数量吗? –

+0

感谢您注意到输入错误,欢迎您随时提供帮助:)至于后续查询,'aggregate()'方法没有'count()'方法,它只能在find )方法,所以你不能在'aggregate()'上应用这个函数。看起来像一个新的问题,你想要达到什么目的,你可以为它创建一个新的问题吗? – chridam

+0

我使用pymongo并制作循环来统计文档数量。它的表演OK! –