使用 MongoDB/Mongoose 按 ID 查找提交
Posted
技术标签:
【中文标题】使用 MongoDB/Mongoose 按 ID 查找提交【英文标题】:Looking up submissions by ID with MongoDB/Mongoose 【发布时间】:2013-02-19 11:09:49 【问题描述】:所以我习惯于通过 mysql 的自动增量主 ID 查找提交,但是在使用 MongoDB ORM 包装器 Mongoose 之后,我发现由于 Mongo 在集合中存储数据的方式不同,实际上并没有任何概念传统的自增 ID。
我现在一直想弄清楚如何获取提交,因为通常我会这样构建我的 URL:
submission/34/category/slug-goes-here
.
由于 34
现在在 Mongo 中变成了一个丑陋的基于字符串的 UUID,我不需要在我的 URL 中显示它,但我想要一个唯一的 URL 来查找我的提交。
我正在考虑可能有一个 set 方法,当我将提交插入我的数据库时,它会生成某种 6 字符哈希,例如zhXk40
并这样查找。
我想知道如果我这样做,性能权衡会是什么。如果我对 slug 进行限制,然后用 slug 查找它们,并验证类别匹配,那会更有效吗?无论哪种方式,我都必须检查类别和 slug 是否匹配,但我不确定在这种情况下是否真的需要 ID。
创建路由+根据该路由从数据库中查找一些数据的最佳实践是什么?
【问题讨论】:
我只是在包含“外部 id”的文档中添加一个新的索引和唯一字段。使用它来查找文档。 【参考方案1】:您应该知道的第一件事是:
_id
属性不一定是“丑陋”的ObjectId
字符串。
实际上,_id
只需要在其集合中是唯一的,所以如果你想使用自动递增的 ID,没有问题,但是...
如果您打算在数据库中使用分片,那么使用自动递增字段作为 _id
是多余的。
为什么?在此处阅读接受的答案:Should I implement auto-incrementing in MongoDB?
在我的应用程序中,由于我们不打算对其进行分片,因此我们使用索引的数字 ID 只是为了便于最终用户使用,并且在内部所有引用都是 ObjectId
s。
另外,这里有一个在 MongoDB 中创建自动递增字段的好教程:http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
【讨论】:
很好的答案。很高兴知道我有这个选项,但更多地思考它似乎更让我感兴趣。最终,如果我想利用分片,它似乎会变得很痛苦,因为我不知道哪个集群的 id 会增加。我现在只用它的对象 ID 来查找它。谢谢:)【参考方案2】:嘘!如果我们能够真正了解这里的最佳实践,我们都会过得更好。会说话的人还在说话,而且还会持续一段时间。
我将如何做到这一点是尽我所能。如果我有一个可用的文本字符串来使其具有语义,那将是最好的情况。
如果我做不到,我会选择你建议的哈希值。
对于这两种解决方案,挑战将是确保它保持独特性。这意味着在保存之前进行查找。
在性能上,它与 SQL 相同。索引你用来查找的东西。 Mongo 在复合索引方面做得很好,所以类别名称和哈希会很快查找。
【讨论】:
以上是关于使用 MongoDB/Mongoose 按 ID 查找提交的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB、Mongoose 和 Apollo GraphQL 在文档中定义 _id 类型
将对象 ID 推送到嵌套数组 MongoDB/Mongoose