【问题标题】:mongo aggregation: Use string matchmongo 聚合:使用字符串匹配
【发布时间】:2015-11-03 13:58:40
【问题描述】:

我有以下格式的文件

{ "_id" : ObjectId("56119c0fe4b0f3b51d0132b1"), "ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900V Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36", "userId" : "55e5d92ce4b0cc9c0a1f1633" }
{ "_id" : ObjectId("56119c0fe4b0f3b51d0132b4"), "ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900V Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36", "userId" : "55f09147e4b0cc9c0a2cfe34" }
{ "_id" : ObjectId("56119ef6e4b0f3b51d013abe"), "ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A405 (5726401600)", "userId" : "55f09147e4b0cc9c0a2cfe34" }
{ "_id" : ObjectId("56119f64e4b0f3b51d013ae7"), "ua" : "Mozilla/5.0 (iPad; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12A405 (5726401600)", "userId" : "55f09147e4b0cc9c0a2cfe35" }

ua 字段有用户代理字符串,它基本上包含用户设备信息。我想找出哪些用户正在使用 iOS(如果字符串包含“iPhone/iPad”)与 Android(如果字符串包含“Android”)。本质上我想要下面的输出

{ "userId" : "56153199e4b0f3b51d043d36" , "iOS": "Yes", "Android" : "No"}
{ "userId" : "55f09147e4b0cc9c0a2cfe34" , "iOS": "Yes", "Android" : "Yes"}
{ "userId" : "56153199e4b0f3b51d043d36" , "iOS": "No", "Android" : "Yes"}

对此的聚合查询是什么样的?

【问题讨论】:

  • 找不到聚合框架的方法。试试我的 MapReduce 示例,让我知道这是否可行。
  • 谢谢。这对我有用。我看不到您在此处发布的 MapReduce 答案了!!

标签: mongodb aggregation-framework


【解决方案1】:

我建议您不要进行 On-the-go 查询处理。因为当您拥有大量数据时,它可能会减慢您的处理速度。

我的理想方法是在插入自身时对用户代理进行后处理或处理传入数据。

例如,假设您要在下面插入文档。

{ "_id" : ObjectId("56119c0fe4b0f3b51d0132b1"), "ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900V Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36", "userId" : "55e5d92ce4b0cc9c0a1f1633" }

你把上面的转换成下面的:

{ "_id" : ObjectId("56119c0fe4b0f3b51d0132b1"), "ua" : "Mozilla/5.0 (Linux; Android 5.0; SM-G900V Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36", "userId" : "55e5d92ce4b0cc9c0a1f1633" ,"android":true, "ios":false}

然后,您可以像下面这样查询来获取使用android的用户,而不是像下面这样的ios:

db.collection_name.find({"android":true, "ios":false})

这比每次都在旅途中更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多