2011-12-19 32 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