使用 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 只是为了便于最终用户使用,并且在内部所有引用都是 ObjectIds。

另外,这里有一个在 MongoDB 中创建自动递增字段的好教程:http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

【讨论】:

很好的答案。很高兴知道我有这个选项,但更多地思考它似乎更让我感兴趣。最终,如果我想利用分片,它似乎会变得很痛苦,因为我不知道哪个集群的 id 会增加。我现在只用它的对象 ID 来查找它。谢谢:)【参考方案2】:

嘘!如果我们能够真正了解这里的最佳实践,我们都会过得更好。会说话的人还在说话,而且还会持续一段时间。

我将如何做到这一点是尽我所能。如果我有一个可用的文本字符串来使其具有语义,那将是最好的情况。

如果我做不到,我会选择你建议的哈希值。

对于这两种解决方案,挑战将是确保它保持独特性。这意味着在保存之前进行查找。

在性能上,它与 SQL 相同。索引你用来查找的东西。 Mongo 在复合索引方面做得很好,所以类别名称和哈希会很快查找。

【讨论】:

以上是关于使用 MongoDB/Mongoose 按 ID 查找提交的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB、Mongoose 和复合 _id

MongoDB、Mongoose 和 Apollo GraphQL 在文档中定义 _id 类型

将对象 ID 推送到嵌套数组 MongoDB/Mongoose

更改 mongoDB/mongoose 中的模式

如何使用 MongoDB/Mongoose 中的先前值更新字段 [重复]

Mongoose - 将用户 _id 保存到不同的 Schema 会更改 ID