2013-01-12 64 views
5

我有一个集合在这些文件中:组合来自不同文档的两个字段MongoDB中

{topic : "a", 
    messages : [ObjectId("21312321321323"),ObjectId("34535345353"),...] 
    }, 
    {topic : "b, 
    messages : [ObjectId("1233232323232"),ObjectId("6556565656565"),...] 
    } 

是否有posibility得到与信息字段的组合的结果?我喜欢得到这样的例子:

 {[ 
     ObjectId(""),ObjectId(""),ObjectId(""),ObjectId("") 
    ]} 

我认为这是可能的MapReduce的,但在我的案件的文件没有任何共同之处。现在我正在使用javascript和循环在后端执行此操作,但我认为这不是最佳选择。谢谢。

回答

4

您可以在Aggregation Framework中使用$group运算符。要使用Aggregation Framework,你需要确保你在MongoDB 2.2或更新版本上运行,当然。

如果与$push一起使用,您将获得连接在一起的所有消息列表。

db.myCollection.aggregate({ $group: { messages: { $push: '$messages' } } }); 

如果与$addToSet一起使用,您将只能得到不同的值。

db.myCollection.aggregate({ $group: { messages: { $addToSet: '$messages' } } }); 

如果你想先请筛选候选文档,你可以使用$match

db.myCollection.aggregate([ 
    { $match: { topic: { $in: [ 'a', 'b' ] } } }, 
    { $group: { matches: { $sum: 1 }, messages: { $push: '$messages' } } } 
]); 
+0

谢谢,我认为这将工作,我正在更新我的mongodb。 –

1

一种选择是使用聚合框架。但是,如果您计划获得大量结果(不仅仅是“轻量级”结果),结果文档大小超过16MB,或者使用过多的系统内存,则需要循环遍历集合中的对象并手动连接结果(正如您现在建议的那样)或者冒着mongodb抛出异常的风险。

聚集限制可在此页面的底部找到:

http://docs.mongodb.org/manual/applications/aggregation/

鉴于限制,您可能希望只使用find与投影只是messages返回。 (和这样的事情,我强烈建议你做一些性能基准来比较你的服务器上的数据选项,因为“互联网”现在会建议,有些人发现聚合支持速度较慢比其他技术)。

+0

是的,聚合框架有限制。正确的解决方案,特别是在规模上,需要平衡权衡。即使您没有达到框架限制,它也可能更具可扩展性,可以在您的客户端而不是数据库服务器上进行内存中的列表合并。 – jared

相关问题