使用guid有一些缺陷,主要与如何使用mongo shell中的二进制表示有关,也与历史事故有关,这些事故导致不同的驱动程序使用不同的字节顺序存储guid.
我使用以下代码来说明这些问题:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
当我运行它的输出时:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
当我在mongo shell中显示它时,我得到:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
请注意,即使显示为十六进制,字节顺序也与原始GUID不匹配.这就是我所说的历史性事故.所有的字节都在那里,由于微软实现了Guid,它们的顺序不同寻常.ToByteArray().
为了帮助您在mongo shell中使用GUI,您可以将以下助手函数文件复制到mongo所在的目录中.exe存储在:
https://github.com/rstam/mongo-csharp-driver/blob/master/uuidhelpers.js
文件顶部有一些简短的文档注释,您可能会发现这些注释很有用.要使这些函数在mongo shell中可用,需要告诉mongo shell在启动时读取该文件.请参见以下示例会话:
C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.6
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
> doc._id.toCSUUID()
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")
>
您还可以使用另一个助手函数来查询GUI:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
至于将您的guid存储为字符串,这并不是前所未闻的事情,而且它确实可以让查看和查询mongo shell中的数据变得更容易,并避免了不同字节顺序的所有问题.唯一的缺点是它占用了更多的空间(大约是原来的两倍).