MongoDB objectId引用

7

我有一个集合,其中文档的id设置为MongoDb Object Ids(因此在数据库中显示为:

Collection1

    "someId": {
        "$oid": "5003cb802e28076412000001"
    },

在另一个集合中,我正在引用它们。但有时这些引用似乎被存储为正确的对象ID:
Collection 2

    "someForiegnId": {
        "$oid": "5003cb802e28076412000001"
    },

有时候它们会作为普通字符串存储在数据库中。
Collection 2    

    "someForiegnId": "5003cb802e28076412000001",

我的问题是 - 将这些外部引用存储为oid格式是否重要,还是它们只能是字符串?

1
将其设置为字符串或对象ID,但不要同时使用两者。我可能会选择字符串。 - Sergio Tulentsev
是的,我现在正在对代码进行合理化,但想知道应该选择哪个。 - UpTheCreek
字符串可以更容易地处理,但在磁盘上的大小也会增加一倍。 - JohnnyHK
@JohnnyHK - 你知道如果对此字段进行索引或查询,是否存在性能优势吗?还是仅仅是空间优化? - UpTheCreek
5
ObjectId 的性能会更好。虽然它们都进行二进制比较,但是 ObjectId 比表示 ObjectId 的字符串数据要小得多。尽管如此,是否差异足以成为真正问题取决于数据集的大小。我认为性能差异很小,但内存消耗将更高(反过来会导致性能降低)。简而言之,如果是 ObjectId ,请使用 ObjectId。 - Remon van Vliet
显示剩余3条评论
1个回答

4
我知道我正在回答一个一年前的问题,但是还是要说一下。
在数据库中保持一致性总是可取的。无论您如何存储数据(例如将IP地址作为字符串“87.123.12.12”,数组[87、123、12、12]或数字1467681804),它都应该始终保持相同的方式。对于数据也是如此:您必须选择一种格式并坚持使用它。
您选择的格式会影响到您使用的存储空间和查询数据的速度。最好的方法是将它们存储为ObjectID,原因如下:
  • 仅需12个字节即可存储对象ID,而使用字符串存储相同的内容需要两倍的空间。虽然这是一个很小的差别,但它是免费的。此外,在您尝试将所有数据存储在内存中(或至少尽可能多地存储)的世界中,这是一个很好的考虑因素。因此,您不仅可以节省硬盘空间,还可以节省RAM。
  • 您可以轻松地从ID获取时间戳。有时候获取对象创建时间会很有用。使用字符串无法实现这一点。
  • 如果您决定基于该字段创建索引,则其大小将更小,并且通过数字查询要比通过字符串查询快得多。

因此,即使我只有字符串表示,我也会改为使用ObjectID()。在您的情况下,这绝对值得转换(我知道您很可能已经这样做了)。

P.S. 您可以通过修改以下答案中的查询来修改该字段。


1
你有查询对象 ID 更快的参考资料吗? - Sebastien Lorber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接