【问题标题】:MongoDB: How do I search multiple collections within same database and return mixed result set?MongoDB:如何在同一个数据库中搜索多个集合并返回混合结果集?
【发布时间】:2014-08-31 04:20:30
【问题描述】:

我有一个单页应用程序,它以我用 JavaScript 编写的 API 为基础,在 Node.js 上运行并使用 MongoDB 进行数据存储。 API 公开了几种不同的内容类型,每一种都存储在我的 MongoDB 数据库中的单独集合中。我的单页应用程序有一个搜索栏,其中包含一个用于选择内容类型的下拉菜单(每个都对应于我的 MongoDB 数据库中的不同集合)和一个用于指定将应用的搜索查询的输入字段。

What I would like to do is: add an option in my dropdown, called "All", and, when this is selected, my API will return the five most-recently created documents, regardless包含这些文档的集合。

因此,例如,我可能有以下集合:

  • 汽车
  • 飞机
  • 自行车

我想在我的 API 中编写 JavaScript,以返回其中最近的五个。因此,如果用户搜索“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 中搜索多个集合,如果可以,我该怎么做?

请注意:

  1. 这与尝试在 Mongo 中进行 JOIN 是一个非常不同的问题 - 或者,至少可以这样。 (请参阅:MongoDB - Search on multiple collections。我不会像在 JOIN 中那样尝试关联来自不同集合的文档。(例如,不能说 Boats 集合中的文档包含有关 Automobiles 集合中文档的详细信息。)李>
  2. 似乎存在一个糟糕的解决方案,它涉及对每个集合运行查询(即,查询五辆汽车、五架飞机、五辆船和五辆自行车;将结果合并到一个数组中,按 createdAt 排序,然后然后将前五个从​​阵列的前面拼接起来)。请参阅:Meteor.js - ways to do user search over multiple collections。但是,如果可能的话,我想避免这种情况,因为(i)它会使查询效率降低 5 倍; (ii) 这会使分页变得非常困难。
  3. 我使用 Sails.js 作为我的框架(因此,使用 Waterline 作为我的 ORM)。所以,即使这在 Mongo 层是不可能的,我推测它可能已经在 ORM 层实现了。是这样吗,如果是这样,我将如何使用它?

【问题讨论】:

  • 在 MongoDB 中,您一次不能查询多个集合。通常,如果这是一个要求,您最好将所有数据存储在一个集合中,并通过“类型”字段分离出不同的类型。不知道有没有人在ORM层做过。

标签: javascript node.js mongodb sails.js waterline


【解决方案1】:

尽管 John Petrone 的评论非常有帮助(因为它指出我在 Mongo 中遇到了限制),但我确实想整理一份可能解决方案的综合列表:

  1. 为每个集合运行查询(即查询五辆汽车、五辆飞机、五艘船和五辆自行车;将结果合并到一个数组中,按 createdAt 排序,然后将前五个从​​数组的前面拼接) . (在上面的问题中查看此解决方案的更多详细信息)。
  2. 根据上面 John Petrone 的评论,将所有这些类型的对象存储在同一个集合中。
  3. 通过仅存储生成搜索结果所需的每个文档中的数据的副本来对数据进行非规范化;所有这些副本,无论它们的源文档存储在哪个集合中,都可以保存在一个集合中(例如,称为 SearchResults),并且我的 SPA 中的搜索可以向查询该集合中文档的 API 端点发出请求。这是对 John Petrone 提出的解决方案(在上面的 cmets 中)的改编,它考虑到了我使用过的 JavaScript/Mongo ORM(即 Waterline 和 Mongoose)的实际限制,如果如果您希望将使用不同模型构建的文档存储在同一个集合中。缺点:需要对创建、更新和删除进行额外查询;存储更多数据;必须使 SearchResult 数据与源文档保持同步。好处:高效的读取查询;轻松兼容 JavaScript/Mongo ORM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多