gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:13:08 26 4
gpt4 key购买 nike

我有一个单页应用程序,它使用我在 Node.js 上运行的 JavasScript 编写的 API,并使用 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 层实现了。是这样吗,如果是这样,我将如何使用它?

最佳答案

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

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

关于javascript - MongoDB:如何在同一数据库中搜索多个集合并返回混合结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com