【发布时间】: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 中搜索多个集合,如果可以,我该怎么做?
请注意:
- 这与尝试在 Mongo 中进行 JOIN 是一个非常不同的问题 - 或者,至少可以这样。 (请参阅:MongoDB - Search on multiple collections。我不会像在 JOIN 中那样尝试关联来自不同集合的文档。(例如,不能说 Boats 集合中的文档包含有关 Automobiles 集合中文档的详细信息。)李>
- 似乎存在一个糟糕的解决方案,它涉及对每个集合运行查询(即,查询五辆汽车、五架飞机、五辆船和五辆自行车;将结果合并到一个数组中,按 createdAt 排序,然后然后将前五个从阵列的前面拼接起来)。请参阅:Meteor.js - ways to do user search over multiple collections。但是,如果可能的话,我想避免这种情况,因为(i)它会使查询效率降低 5 倍; (ii) 这会使分页变得非常困难。
- 我使用 Sails.js 作为我的框架(因此,使用 Waterline 作为我的 ORM)。所以,即使这在 Mongo 层是不可能的,我推测它可能已经在 ORM 层实现了。是这样吗,如果是这样,我将如何使用它?
【问题讨论】:
-
在 MongoDB 中,您一次不能查询多个集合。通常,如果这是一个要求,您最好将所有数据存储在一个集合中,并通过“类型”字段分离出不同的类型。不知道有没有人在ORM层做过。
标签: javascript node.js mongodb sails.js waterline