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

合并Mongodb中不同文档的两个字段,mongodb,Mongodb,我收集了以下文件: {topic : "a", messages : [ObjectId("21312321321323"),ObjectId("34535345353"),...] }, {topic : "b, messages : [ObjectId("1233232323232"),ObjectId("6556565656565"),...] } 是否有可能通过消息字段的组合获得结果?我想举个例子: {[ ObjectId

我收集了以下文件:

   {topic : "a",
    messages : [ObjectId("21312321321323"),ObjectId("34535345353"),...]
   },
   {topic : "b,
    messages : [ObjectId("1233232323232"),ObjectId("6556565656565"),...]
   }
是否有可能通过消息字段的组合获得结果?我想举个例子:

     {[
       ObjectId(""),ObjectId(""),ObjectId(""),ObjectId("")
     ]}
我认为这在MapReduce中是可能的,但在我的例子中,这些文档没有任何共同之处。现在我在后端使用javascript和循环来实现这一点,但我认为这不是最好的选择。谢谢。

您可以在中使用操作员。当然,要使用聚合框架,您需要确保您运行的是MongoDB 2.2或更高版本

如果与您一起使用,则会将所有消息列表连接在一起

db.myCollection.aggregate({ $group: { messages: { $push: '$messages' } } });
如果与一起使用,将只获得不同的值

db.myCollection.aggregate({ $group: { messages: { $addToSet: '$messages' } } });
如果您想先筛选候选文档,可以使用


一种选择是使用聚合框架

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

聚合限制可在本页底部找到:

考虑到这些限制,您可能只想与投影一起使用,只返回
消息


(对于类似的情况,我强烈建议您做一些性能基准测试,以将选项与服务器上的数据进行比较,因为“互联网”现在表明,有些人发现聚合支持比其他技术慢)。

是的,聚合框架存在局限性。正确的解决方案,特别是在规模上,需要平衡权衡。即使没有达到框架限制,在客户机而不是数据库服务器中进行内存中列表合并也可能更具可扩展性。
db.myCollection.aggregate([
    { $match: { topic: { $in: [ 'a', 'b' ] } } },
    { $group: { matches: { $sum: 1 }, messages: { $push: '$messages' } } }
]);