7

有什么区别:

{
   _id: ObjectId("507f191e810c19729de860ea")
}

{
   _id: "507f191e810c19729de860ea"
}

我似乎在这件事上找不到任何东西。

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

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

4

2 回答 2

9

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

也就是说,您可以为您的_id字段使用任何您想要的东西,但建议您坚持一致的方案 - 使用所有字符串(以及在您从外键引用其他文档的情况下使用字符串)或使用所有 ObjectID。使用 ObjectID 是传统的做法,但只要您有一个完全一致的方案,您就不应该遇到重大问题。

于 2013-04-12T20:19:24.443 回答
2

最大的区别当然是目标存储以及您在 API 中如何与之交互。(我在 StackOverflow 上写过与 DBRefs 相关的类似内容)

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

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);
});

我已经多次成功地使用了这种技术。当我没有明确地将其设置_id为自定义 ID(某种自定义键)时,我总是使用该ObjectId格式,因为它相对较小且唯一(并且小于 UUID 并且还嵌入了创建时间,这有时非常好) .

于 2013-04-12T21:23:03.800 回答