2011-12-19 33 views
4

当它是一个GUID时,遇到一些问题从Mongo在Id上查询。我有一个非常愚蠢的测试课,它只是公开的Guid Id {get; set}。我创建一个集合,并插入这个测试类。在shell我认为这是C#驱动程序处理GUID

{ "_id" : BinData(3,"9q+FwoU/RE2+Iq3w7hK1JA==") } 

然后我尝试做

var query = Query.EQ("Id", Id); 

如果我看在调试器,它显示为

{ "Id" : CSUUID("c285aff6-3f85-4d44-be22-adf0ee12b524") } 

但是,它不返回任何东西..我在这里错过了明显的东西?另外,注意,shell不知道什么是CSUUID ..有没有办法启用它? CentOS服务器如果很重要...

回答

4

Id会自动映射到保留主键名_id。你应该改变你的查询为

Query.EQ("_id", Id) 

这应该解决你的问题。


一些背景有关的GUID

这件事CSUUID然而,好知道,:它告诉你的驱动程序使用在C#驱动程序的GUID的遗产表示。我相信这仍然是默认设置,所以不必担心。有不同的编码,因为其他语言或操作系统有不同的字节顺序。

您可以扩展shell来“理解”的GUID不同的格式,一个非常有用的扩展在任何情况下,各种调试:

https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

这使得它更容易使用调试贝壳。只需下载js并使用mongo --shell uuidhelpers.js启动mongo即可。

+0

完美感 - 谢谢! – XeroxDucati 2011-12-19 21:26:55

+0

要停止添加CSUUID的驱动程序,您可以将值作为字符串而不是GUID传递。 – Andrew 2014-01-08 02:43:03

+0

@Andrew:不,你不能。这将查找数据库中的字符串,并且'CSUUID(someString)!= someString'。 'ObjectId'也是如此。而且,这些字符串需要比它们的字节表示更多的存储空间。更重要的是,该驱动程序不'添加'CSUUID'。 'CSUUID'是一个js帮助程序方法,它使您能够轻松创建C#从JavaScript中的字符串使用的相同二进制表示,因此驱动程序的ToString()方法具有覆盖,因此调试器中显示的内容可用于从命令行查询数据库。 – mnemosyn 2014-01-08 09:46:57