2012-04-26 77 views
0

嗯,我正在努力解决聚集问题。我认为解决问题最简单的方法是使用map reduce或单独查找查询,然后使用异步库帮助进行循环。聚合MongoDB的数据,地图缩小还是其他方式?

的模式是在这里:

db.keyword 
keyword: String 
start: Date 
source: String(Only one of these (‘google’,’yahoo’,’bing’,’duckduckgo’)) 
job: ref db.job 
results: [ 
    { 
      title: String 
      url: String 
      position: Number 
    } 
] 


db.job 
name: String 
keywords: [ String ] 
urls: [ String ] 
sources: [ String(‘google’,’yahoo’,’bing’,’duckduckgo’) ] 

现在我需要的数据,以这种形式:

data = { 
    categories: [ 'keyword1', 'keyword2', 'keyword3' ], 
    series: [ 
     { 
      name: 'google', 
      data: [33, 43, 22] 
     }, 
     { 
      name: 'yahoo', 
      data: [12, 5, 3] 
     } 

    ] 
} 

那么最大的问题是,该系列[0]。数据阵列由很难找到,将db.job.urls与db.keyword.results.url匹配,然后获取该位置。 有没有什么办法来简化query_?我已经浏览了很多地图缩小的例子,但是我无法找到正确的方式来映射哪些数据并减少哪些数据。

+0

我不明白你想要的表单。输出中的“data”数组是什么?您是否试图将所有关键字的所有结果放入一个文档中?无论如何,您无法跨多个集合执行MapReduce。 – kristina 2012-04-26 14:21:39

+0

很高兴知道,函数作用域怎么样,我可以访问map中的外部变量并减少函数吗? – 2012-04-26 18:59:33

+0

只有通过“范围”参数传入。 – kristina 2012-04-26 21:32:00

回答

2

看起来好像您正在尝试合并来自两个单独集合(关键字和作业)的数据。

Map Reduce和新的Aggregation Framework一次只能在一个集合上操作。

最好的办法是分别查询每个集合并以编程方式组合结果,并将它们保存为最适合您的应用程序的形式。

如果您想尝试使用Map Reduce,则可以链接到用户编写的博客帖子,该用户使用增量Map Reduce操作来组合两个集合中的值。
http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

有关使用地图与MongoDB的减少的更多信息,请参阅蒙戈文档: http://www.mongodb.org/display/DOCS/MapReduce (增量地图缩小部分是在这里:http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

有一些额外的地图减少例子MongoDB的食谱: http://cookbook.mongodb.org/

有关的地图如何减少操作的一步一步的演练运行,请参阅MongoDB的食谱配方的“其他”节“查找最大值和最小值V与版本文档“http://cookbook.mongodb.org/patterns/finding_max_and_min/

希望上述会给你一些想法如何实现你想要的结果。正如我所提到的,我相信最直接的解决方案就是以编程方式组合结果。但是,如果您成功编写了Map Reduce操作,请发布您的解决方案,以便社区可以从您的体验中获益。

+0

谢谢你解释答案,因为你已经说过一种解决方案是将数据编程在一起。这引发了另一个问题,如对数据库的异步查询,这不会使数据组合变得容易(对于代码流控制,我将使用异步)。 – 2012-04-26 19:03:54

+0

jurka,jQuery延迟nodejs使得一堆异步调用非常易于管理。 http://techishard.wordpress。COM/2012/05 /第29 /制造,猫鼬,保持其通的承诺 - 在服务器上/ – grantwparks 2012-05-29 17:19:55