有什么区别:
{
_id: ObjectId("507f191e810c19729de860ea")
}
和
{
_id: "507f191e810c19729de860ea"
}
我似乎无法找到任何关于此事的内容。
让我感到困惑,因为当您使用JavaScript插入时,它将使用ObjectId("507f191e810c19729de860ea")
格式。
但是如果你使用C#驱动程序,它将使用"507f191e810c19729de860ea"
格式。
字符串格式似乎是更好的选择,因为它占用的空间更少。
答案 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和还嵌入创作时间,这有时非常好。)