【发布时间】:2020-03-10 20:57:58
【问题描述】:
问题:
我正在使用 Node MongoDB 驱动程序。我正在尝试确定是否应该编写一个从三个集合中获取数据的单个查询,或者数据库是否需要一个包含引用或嵌入文档等的集合……连接这三个不相关的集合。
用户案例:
在搜索过程中,我得到一个对象数组,我从数组中取出前 10 个,每个对象都是关于属于三个集合之一的文档的元数据。这些集合是不相关的,但有一些共同的字段,这些元数据是在后期获取信息的唯一途径。
例如,在搜索过程中,我获取并以 React 状态存储此数组(请参阅下面的示例对象),然后当用户单击搜索结果时,我必须在此数组中循环,以便我可以去抓取相关元数据以便能够检索更多内容……
对象数组中的示例对象(元数据):
[{
collection: 'pmc_test',
id_field: 'id_int',
id_type: 'int',
id_value: 2657156
},
{
collection: 'arxiv',
id_field: 'id_int',
id_type: 'int',
id_value: 2651582
},
{
collection: 'crossref',
id_field: 'DOI',
id_type: 'string',
id_value: "10.1098/rsbm.1955.0005"
},
...] // different collections, usually passed with 10 objects
但是,要显示 10 个搜索结果,我必须遍历数组中的每个对象,修改并运行一个查询,这可能会导致 10 个单独的查询。所以我至少可以通过使用 $in 运算符执行 3 个查询来最小化这种情况,并提供三个代表每个集合的 ID 数组。
这仍然是多个查询,我必须转到第一个集合,然后是第二个集合,然后是第三个集合,然后将所有结果组合在一起以显示搜索结果。这是我试图避免的。这就是这三个集合中每个集合的大致样子。
对我可以使用什么查询方法有什么建议吗?数据库是否会从单一集合/方法中受益,从而避免使用元数据来查看三个不同的集合?
目前,这是对应用程序的重大突破性更改,导致至少 15 个功能/api 调用需要更新,我想保持查询一个集合的能力并建议将此作为最佳更改。
提前致谢。
编辑
此处的示例集合:
Arxiv 合集:https://gist.github.com/Natedeploys/6734dffccea7b293ca16b5bd7c73a6b6
交叉引用集合: https://gist.github.com/Natedeploys/9b0d3b02c665d7507ed75c9d5fbff159
Pubmed 集合(pmc_test): https://gist.github.com/Natedeploys/09527e8ceaf5d3f0f70ba28984b87a73
【问题讨论】:
-
我理解聚合语法可能会令人困惑,但这不是不当行为的借口。试试mongodb.com/cloud/atlas。他们有很好的可视化工具来构建管道。 M0 层是免费的,您唯一需要付出的努力就是在每个集合中插入少量文档。没有其他方法 - 您要么自己学习如何做,要么请别人为您做。
-
我没有要求任何人为我构建或编写代码。我只是想要关于最佳方法的建议。感谢您提供的链接,我将提供 DBREF 或嵌入式文档。
-
DBRefs 无济于事。它们在客户端上得到解决。我不记得 nodejs 驱动程序中的实现细节,但即使在基本情况下,每个数据库的在线查询也不会少于 1 个。如果您不经常修改嵌入的文档并且文档的总大小不超过 16MB 的限制,那么嵌入是一个不错的选择。
-
感谢您,我将创建一个带有嵌入的示例数据库并对其进行查询。我正在考虑使用元数据和相关嵌入文档构建一个集合,其中仅包含客户需要的字段,但是我不确定这是否很好,因为它会复制数据,也许只是 _id 和集合名称就足够了
标签: node.js database mongodb nosql node-mongodb-native