我可以使用String作为mongodb文档的ID类型吗?

Gel*_*Luo 14 key mongodb morphia

我正在使用java/morphia来处理mongodb.从Java层使用默认的ObjectId不是很方便.我想将它作为String类型,同时使用ObjectId保持密钥生成过程_id = new ObjectId.toString().

我想知道这样做是否有任何副作用?例如,它会以任何方式影响数据库性能或导致密钥冲突吗?它会影响分片环境......

Ser*_*sev 22

您可以为_id字段使用任何类型的值(Arrays除外).如果您选择不使用ObjectId,则必须以某种方式保证值的唯一性(将ObjectId强制转换为字符串).如果您尝试插入重复键,将发生错误,您将不得不处理它.

当您尝试将具有相同_id的两个文档插入到不同的分片时,我不确定它对分片群集有什么影响.我怀疑它会让你插入,但这会在以后咬你.(我得测试一下).

那就是说,你应该没有麻烦_id = (new ObjectId).toString().

  • 如果要获取ID的新字符串值,请使用`(new ObjectId).valueOf()`而不是`(new ObjectId).toString()`(在MongoDB ver 2.2中更改). (3认同)

Dan*_*n H 6

是的,您可以使用字符串作为 _id。

仅当您(在文档中)有一些自然是很好的唯一密钥的值时,我才会推荐它。我在一个集合中使用了这种设计,其中有一个字符串地理标签,其形式为“xxxxyyyy”;这个每个文档唯一的字段必须位于文档中,并且我必须在其上构建索引......那么为什么不使用它作为键呢?(这避免了一个额外的键值对,并且避免了集合上的第二个索引,因为 MongoDB 自然地在“_id”上构建了一个索引。考虑到集合的大小,这两者加起来可以节省大量空间。)

然而,从你的问题的语气来看(“ObjectID 不是很方便”),如果你想使用字符串的唯一原因是你不想费心去弄清楚如何整齐地管理 ObjectID ......我'我建议您值得花时间思考这些问题。我确信他们不会成为麻烦...一旦你解决了他们的麻烦。

否则:你有什么选择?以后每次使用 MongoDB 时都会编造字符串 ID 吗?

  • 嘿,谢谢您回到我四年前提出的问题。我想从那时起我对MongoDB有了更多的了解。现在我认为将 ObjectId 存储为字符串确实是一个坏主意,因为 ObjectId 实际上是三个整数,而它的 String 表示形式是 24 个字符,这在空间和时间方面都不是高效的。 (7认同)

Des*_*ino 5

我实际上做了同样的事情,因为我在将ObjectId转换为JSON时遇到了一些问题.

然后我做了类似的事情

@Id
private String id;
public String getId() {
    return id();
}
public void setId(String id) {
    this.id = id;
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我决定更新以前插入的文档,当我通过JSON将对象通过JSON发送到页面并通过JSON post接收相同的更新对象然后使用数据存储区中的保存功能,而不是更新以前的数据,它插入了一个新文档,而不是更新已经存在的文档.

即使最糟糕的是,新文档的ID与之前插入的ID相同,我认为这是不可能的.

无论如何,我将私有对象设置为ObjectID,然后将get set保留为字符串,然后按预期工作,不确定在您的情况下是否有帮助.

@Id
private ObjectId id;
public String getId() {
    return id.toString();
}
public void setId(String id) {
    this.id = new ObjectId(id);
}
Run Code Online (Sandbox Code Playgroud)