2015-11-02 25 views
0

我有我在下面的格式蒙戈聚集:使用字符串匹配

{ "_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"} 

这个样子的聚合查询如何?

+1

无法找到聚合框架的方式。试试我的MapReduce示例,让我知道这是否可行。 – jpaljasma

+0

谢谢。这对我有用。我没有看到你在这里发布的MapReduce答案! –

回答

3

我建议你不要去做这个去查询处理。因为当你有大量数据时它可能会减慢处理速度。

我这样做的理想方式可能是,后处理用户代理或处理传入数据,同时插入自己。

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

{ "_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}) 

这是更快比每次都在路上做。