结合Mongodb中不同文档的两个字段

时间:2013-01-12 23:06:53

标签: mongodb

我将这些文件放在一个集合中:

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

是否有可能通过消息字段组合获得结果?我想以此为例:

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

我认为这可以通过MapReduce实现,但在我的情况下,文档没有任何共同之处。现在我正在使用javascript和循环在后端执行此操作,但我认为这不是最佳选择。感谢。

2 个答案:

答案 0 :(得分:4)

您可以使用$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' } } }
]);

答案 1 :(得分:1)

一种选择是使用聚合框架。

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

汇总限制可以在本页底部找到:

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

鉴于这些限制,您可能只想使用带有投影的find来返回messages

(有了这样的话,我强烈建议你做一些性能基准来比较你的服务器上的数据选项,因为“互联网”现在建议有些人发现聚合支持比其他技术)。