使用mongodb和guids获取文档的ID什么是存储Guid以轻松检索实际Guid的有效方法?我正在运行2.06版的Mongodb和10Gen提供的C#驱动程序的版本(1.5)。我的每个实体都有一个Id属性集...[BsonId(IdGenerator=typeof(GuidGenerator))]publicGuidId{get;放;Id字段存储为Binary-3:UuidLegacy。由于我在实体上调用ToJson()时的存储方式,它会为Id返回以下javascript对象。_id:Object$binary:"somevalueshere"$type:"03"这显然是因为数据存储为Binary=3:UuidLegacy。这是有道理的。我想在我的Javascript代码中使用实际的Guid。如果我使我的Id属性如下所示,MongoDB的效率如何?[BsonId(IdGenerator=typeof(GuidGenerator)),MongoDB.Bson.Serialization.Attributes.BsonRepresentation(BsonType.String)]publicGuidId{get;放;这使得mongodb将我的Id存储为一个字符串。但这到底有多有效呢?我想二进制格式更适合我的Id,但我确实需要Guid。我如何从binary-3:uuidLegacy转到我在json中需要的Guid?我想另一个想法是我可以使用发送给我的$binary值?我使用Id执行查找,例如我的查询字符串的一部分。谢谢,使用GUID有一些缺陷,主要与如何使用mongoshell中的二进制表示有关,以及导致不同驱动程序以不同字节顺序存储GUID的历史事故。我用下面的代码来说明这个问题:vardocument=newBsonDocument{{"_id",Guid.NewGuid()},{"x",1}};集合.Drop();集合。插入(文档);安慰。WriteLine("插入的GUID:{0}",document["_id"].AsGuid);当我运行输出时:InsertedGUID:2d25b9c6-6d30-4441-a360-47e7804c62be当我在mongoshell中显示它时,我得到:>vardoc=db.test.findOne()>doc{"_id":BinData(3,"xrklLTBtQUSjYEfngExivg=="),"x":1}>doc._id.hex()c6b9252d306d4144a36047e7804c62be>请注意,即使显示为十六进制,字节顺序与原始GUID不匹配。这就是我所说的历史事故。所有字节都在那里,由于Microsoft的Guid.ToByteArray()实现,它们只是以不寻常的顺序排列。为了帮助您在mongoshell中使用GUID,您可以将以下辅助函数文件复制到mongo.exe所在的目录中:https://github.com/rstam/mongo-csharp-driver/blob/master/uuidhelpers。js这个文件的顶部有一些简短的文档注释,你可能会觉得有用。要使这些功能在mongoshell中可用,您需要告诉mongoshell在启动时读取此文件。请参阅以下示例会话:C:mongodbmongodb-win32-x86_64-2.0.6bin>mongo--shelluuidhelpers.jsMongoDBshell版本:2.0.6连接到:测试类型“help”以获得帮助>vardoc=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存储为字符串,这并非闻所未闻mongoshell更简单,避免了所有不同字节序的问题。唯一的缺点是它占用更多空间(大约两倍)。以上是C#学习教程:使用mongodb和guids获取文档的ID是一种高效的存储Guid的方法,方便检索实际的Guid?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
