1

假设我有两个集合:

ProductsCategories

后一个集合的文档有 2 个字段:

  • _id ( BSON ObjectId)
  • 名称(字符串)

后一个集合的文档有 3 个字段:

  • _id ( BSON ObjectId)
  • 名称(字符串)
  • 产品(字符串数组)

假设我有以下Product文件:

{ "_id" : ObjectId("AAA"), "name" : "Shovel" }

假设我有以下Category文件:

{ "_id" : ObjectId("BBB"), "Name" : "Gardening", "Products" : ["AAA"] }

出于本示例的目的,假设AAABBB是合法的 ObjectId - 示例:ObjectId("523c7df5c30cc960b235ddee")它们将等于内部 ObjectId 的字符串。

字段是否应该Products存储为ObjectId(...)'s 而不是字符串?

4

3 回答 3

1

我不认为它真的那么重要。

我很确定 ObjectId 格式会编码一个十六进制数字,因此它在内存和带宽方面的效率可能会稍微高一些。我已经做到了两种方式。只要您决定,对于每个字段,您将如何对其进行编码,任何一个都可以正常工作。

于 2013-09-23T02:46:21.303 回答
1

只要您始终使用相同的类型(以便正确进行比较),区别在于:

  1. AnObjectId不能与String相同ObjectId值的表示进行比较。因此,ObjectId("523c7df5c30cc960b235ddee")不等于"523c7df5c30cc960b235ddee"
  2. ObjectIds,当本地存储时,将存储为 12 个字节,加上字段名称
  3. 一个ObjectId,当存储为字符串时,通常会以 24 个字节存储(因为它将被转换为十六进制数),加上字段名称
  4. 使用 12 字节数可以更高效地进行比较,因为它比较的字节数更少。不过,在大多数类型的使用中都没有关系,所以这是一个微优化(但你应该知道的事情)
  5. 奖励 - 如果您不使用简短的缩写字段名称,则使用ObjectId本机作为 12 字节的大小优势真的无关紧要,因为当存储为字符串时,字段名称将远远超过字节的大小。

我建议将它们存储为 native ObjectIds。一些驱动程序可以选择性地和透明地转换为ObjectIdaString并返回,以便客户端代码可以更轻松地操作它。例如,C# 驱动程序可以做到这一点,我已经使用了它,以便在序列化为 JSON 时,它ObjectId是一种易于在 JavaScript 中使用的简单格式。

于 2013-09-23T12:41:01.260 回答
0

当您尝试从类别集合开始查找产品的详细信息时,这将最重要。

由于 Mongo 中没有服务器端 JOIN,因此您的代码必须将文档匹配在一起。ObjectID 被编码为 12 个字节,您可以轻松地用任何语言进行比较。使用字符串或对象 ID 并不重要。

您面临的真正问题是数据规范化(或缺乏规范化)之一。如果您将Name字段Categories而不是 ObjectID 存储在文档中,您将能够在一次调用中返回产品名称(而不是多次调用,该类别的每个产品 1 个)。

第一次做的时候感觉不对。毕竟,如果您更改产品名称,您将不得不更新许多文档,这可能会也可能不会经常发生。您必须通过考虑应用程序使用数据的方式来对数据进行建模。

最后,索引集合Name中的属性。Prodcuts从您在文档中找到的字符串开始获取产品的详细信息Categories会很快。

另一种方法是根本没有 Categories 集合,而是在文档中添加一个Category属性。Products您可以找到具有{'Category':'Gardening'}. 索引该Category字段可能是一个好主意。

同样,ObjectID 或 String 并不重要。它是关于建模您的数据,考虑您的应用程序将如何使用它。

于 2013-09-23T03:10:15.800 回答