7

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

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

是否有可能通过消息字段的组合获得结果?我喜欢得到这个,例如:

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

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

4

2 回答 2

5

您可以使用聚合框架$group中的运算符。当然,要使用聚合框架,您需要确保您在 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' } } }
]);
于 2013-01-12T23:18:29.407 回答
1

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

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

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

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

鉴于限制,您可能只想使用find和投影来返回 just messages

(对于这样的事情,我强烈建议您进行一些性能基准测试,以将选项与您服务器上的数据进行比较,因为“Internet”现在建议有些人发现聚合支持比其他技术慢) .

于 2013-01-12T23:40:24.977 回答