MongoDB:如何在同一个数据库中search多个集合并返回混合结果集?

我有一个单页面应用程序,它是基于在Node.js上运行的JavasScript中编写的API并使用MongoDB进行数据存储的。 API公开了几种不同的内容types,每种内容都存储在我的MongoDB数据库的一个单独的集合中。 我的单页面应用程序有一个search栏,包含一个下拉select内容types(每个对应于我的MongoDB数据库中的不同集合)和一个input字段来指定一个将要应用的search查询。

我想要做的是:在我的下拉菜单中添加一个名为“All”的选项,当选中此选项时,我的API将返回五个最近创build的文档,而不pipe包含这些文档的集合。

所以,作为一个例子,我可能有以下的集合:

  • 汽车
  • 飞机
  • 自行车

我想在我的API中编写JavaScript,返回这些中的最近五个。 因此,如果用户search“G”,我生成的JSON响应可能包含来自每个集合的几个文档,如下所示:

[ { "_id": "123", "name": "Golf, "collection: "Automobile", "createdAt": "2014-06-20T01:45:00.0000Z" }, { "_id": "234", "name": Gulfstream", "collection": "Airplane", "createdAt": "2014-06-19T01:45:00.0000Z" }, { "_id": "345", "name": "Glastron", "collection": "Boat", "createdAt": "2014-06-18T01:45:00.0000Z" }, { "_id": "456", "name": "Gary Fisher", "collection" "Bicycle", "createdAt": "2014-06-17T01:45:00.0000Z" } { "_id": "567", "name": "Grand Prix", "collection": "Automobile", "createdAt": "2014-06-16T01:45:00.0000Z" } ] 

问题:在Mongo中是否可以search多个可能的集合,如果可以,我该怎么做?

请注意:

  1. 这是一个非常不同的问题,而不是尝试在Mongo中joinJOIN,或者至less可以。 (请参阅: MongoDB – 在多个集合上进行search我并不想像在JOIN中那样关联不同集合中的文档(例如,不能说Boats集合中的文档包含有关Automobiles集合中文档的详细信息。 )
  2. 在那里似乎有一个不好的解决scheme,将涉及对每个集合运行查询(即查询五辆汽车,五架飞机,五艘船和五辆自行车;将结果合并到一个数组中,按照createdAt进行sorting,然后拼接arrays前面的前五个)。 请参阅: Meteor.js – 在多个集合上进行用户search的方法 。 但是,如果可能的话,我想避免这种情况,因为(i)它会使查询效率降低5倍; 和(二)它会使分页非常困难。
  3. 我使用Sails.js作为我的框架(因此,Waterline作为我的ORM)。 所以,即使在Mongo层中这是不可能的,我推理它可能已经在ORM层实现了。 是这样,如果是这样,我将如何使用它?

虽然John Petrone的评论是非常有帮助的(因为它指出我在Mongo中遇到了一个限制),但是我确实想整理一个可能的解决scheme:

  1. 对每个集合运行查询(即查询五辆汽车,五架飞机,五艘船和五辆自行车;将结果合并到一个数组中,按照createdAt进行sorting,然后将前五个数组拼接在一起)。 (在上面的问题中查看这个解决scheme的更多细节)。
  2. 按上面John Petrone的评论,将所有这些对象存储在同一个集合中。
  3. 通过仅存储来自生成search结果所需的每个文档的数据的副本来使数据非规范化; 所有这样的副本,无论其源文档被存储在哪个集合中,都可以保存在一个集合中(称为例如SearchResults),并且我的SPA中的search可以请求查询该集合中的文档的API端点。 这是John Petrone提出的解决scheme(在上面的评论中)的一种改进,它考虑到了我曾经使用过的JavaScript / Mongo ORM的实际限制(如Waterline和Mongoose),如果这样做会使生活真的很悲惨您希望将使用不同型号构build的文档存储在同一个集合中。 缺点:在创build,更新和删除时需要额外的查询; 更多的数据存储; 必须保持SearchResult数据与源文件同步。 好处:有效的阅读查询; 轻松兼容JavaScript / Mongo ORM。