2013-04-12 152 views
3

有什么区别:我似乎无法找到对此事的任何_id:ObjectID和String之间有什么区别?

{ 
    _id: ObjectId("507f191e810c19729de860ea") 
} 

{ 
    _id: "507f191e810c19729de860ea" 
} 

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

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

+0

你是什么意思,C#驱动程序使用“字符串”格式? – WiredPrairie

+0

它可能只是一个锐皮:)。我正在使用'cm.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);'和'ObjectId.GenerateNewId()。ToString();'它使它成为后者。猜猜我会尝试'ObjectIdGenerator.Instance'下一个:) - 我有很多麻烦让它工作,所以尝试了很多东西。 –

回答

7

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

这就是说,你可以使用你想为你的_id场什么,但我们建议你坚持一个一致的方案 - 无论是使用的所有字符串(以及字符串,你从外键引用其他文件的情况下)或使用所有的ObjectIDs。通常使用ObjectIDs,但只要你有一个完全一致的方案,你不应该有重大的问题。

+0

有道理。你知道为什么C#驱动程序使用字符串格式而不是较小的ObjectId? –

+0

不知道,但驱动程序可能包含一个ObjectID工厂,您可以使用它。 –

+0

基督所说的完全正确。在mongo中,ObjectID是一个12字节的BSON对象ID,它也基于时钟,几乎不可能具有相同的对象ID。更多信息:http://bsonspec.org/#/specification – lciamp

2

最大的区别当然是目标存储以及您在API中如何与它进行交互。 (我在StackOverflow上写了类似于here的东西,因为它与DBRefs相关)。

当使用C#驱动程序(和普通的老C#-objects),如果要强制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); 
}); 

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

+0

我明白了,这是非常有用的。非常感谢! –

相关问题