_id:ObjectID和String之间有什么区别?

时间:2013-04-12 20:16:27

标签: mongodb

有什么区别:

{
   _id: ObjectId("507f191e810c19729de860ea")
}

{
   _id: "507f191e810c19729de860ea"
}

我似乎无法找到任何关于此事的内容。

让我感到困惑,因为当您使用JavaScript插入时,它将使用ObjectId("507f191e810c19729de860ea")格式。 但是如果你使用C#驱动程序,它将使用"507f191e810c19729de860ea"格式。

字符串格式似乎是更好的选择,因为它占用的空间更少。

2 个答案:

答案 0 :(得分:8)

ObjectID是一个12字节的BSON对象ID(它需要24才能显示为十六进制,因为您需要两个十六进制字符来编码一个字节值)。该字符串是一个完整的24个字节。有关详细信息,请参阅ObjectID specification

也就是说,您可以在_id字段中使用任何您想要的内容,但建议您坚持使用一致的方案 - 使用所有字符串(以及在引用其他文档的情况下使用字符串)密钥)或使用所有ObjectID。使用ObjectID是常规的,但只要你有一个完全一致的方案,就不应该有它的重大问题。

答案 1 :(得分:2)

最大的区别当然是目标存储以及您在API中与它进行交互的方式。 (我在StackOverflow上写了与DBRefs相关的类似here的内容。

使用C#驱动程序(以及普通旧C#对象)时,如果要强制将Id存储为ObjectId,则可能需要使用BsonRepresentationAttribute:< / p>

public class StackOverflow
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public string Name { get; set; }
}

或者如果你想保持你的类没有MongoDB属性:

BsonClassMap.RegisterClassMap<StackOverflow>(cm => {
    cm.AutoMap();
    cm.IdMemberMap.SetRepresentation(BsonType.ObjectId);
});

我已成功使用此technique多次。当我没有明确地将_id设置为自定义ID(某种自定义键)时,我总是使用ObjectId格式,因为它相对较小且独特(并且小于UUID和还嵌入创作时间,这有时非常好。)