使用mongodb和guids来获取文档的ID是什么有效的方式来存储Guids以轻松检索实际的Guid?
我正在运行Mongodb的2.06版本和10Gen提供的C#驱动程序的版本(1.5)。
我的每个实体都有一个Id属性设置……
[BsonId(IdGenerator = typeof(GuidGenerator))] public Guid Id { get; set; }
Id字段存储为Binary – 3:UuidLegacy。 由于我在实体上调用ToJson()时它的存储方式,它返回Id的以下javascript对象。
_id : Object $binary: "some values here" $type: "03"
这显然是因为数据存储为Binary = 3:UuidLegacy。 这是有道理的。
我想在我的Javascript代码中使用实际的Guid。 如果我将我的Id属性看起来如下,那么对MongoDB有多高效?
[BsonId(IdGenerator = typeof(GuidGenerator)),MongoDB.Bson.Serialization.Attributes.BsonRepresentation(BsonType.String)] public Guid Id { get; set; }
这使得mongodb将我的Id存储为字符串。 但这真的有多高效? 我猜我的Id的二进制格式更好,但我真的需要Guid。
我如何从二进制 – 3:uuidLegacy转到我在json中需要的Guid?
我想另一个想法是我可以使用发送给我的$ binary值吗? 我使用Id执行查找,例如我的查询字符串的一部分。
谢谢,
使用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 >
请注意,即使显示为hex,字节顺序也与原始GUID不匹配。 那是我正在谈论的历史事故。 所有字节都在那里,由于微软实施了Guid.ToByteArray(),它们只是处于不寻常的顺序。
为了帮助您使用mongo shell中的GUID,您可以将以下帮助程序函数文件复制到存储mongo.exe的目录中:
https://github.com/rstam/mongo-csharp-driver/blob/master/uuidhelpers.js
该文件顶部有一些简短的文档注释,您可能会发现它们很有帮助。 要在mongo shell中使这些函数可用,您需要告诉mongo shell在启动时读取该文件。 请参阅以下示例会话:
C:mongodbmongodb-win32-x86_64-2.0.6bin>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") >
您还可以使用另一个辅助函数来查询GUID:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")}) { "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 } >
至于将GUID存储为字符串,这不是闻所未闻的事情,它肯定使查看和查询mongo shell中的数据更容易,并避免了不同字节顺序的所有问题。 唯一的缺点是它占用更多空间(大约两倍)。
上述就是C#学习教程:使用mongodb和guids来获取文档的ID是什么有效的方式来存储Guids以轻松检索实际的Guid?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1026829.html