Драйвер C#, обрабатывающий идентификаторы GUID

Возникли некоторые проблемы с запросом от Mongo по идентификатору, когда это guid. У меня действительно глупый тестовый класс, это просто общедоступный идентификатор идентификатора {get;set}. Я создаю коллекцию и делаю вставку этого тестового класса. В оболочке я вижу это как

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

затем я пытаюсь сделать

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

Если я смотрю в отладчике, он отображается как

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

Однако он ничего не возвращает. Я здесь что-то пропустил? Кроме того, примечание: оболочка понятия не имеет, что такое CSUUID... есть ли способ включить это? Сервер CentOS, если это имеет значение...


person XeroxDucati    schedule 19.12.2011    source источник


Ответы (1)


Id будет автоматически сопоставлено с зарезервированным именем первичного ключа _id. Вы должны изменить свой запрос на

Query.EQ("_id", Id)

Это должно решить вашу проблему.


Некоторые сведения об идентификаторах GUID

Однако полезно знать эту вещь о CSUUID: она говорит вам, что драйвер использует устаревшее представление GUID в драйвере C#. Я считаю, что это все еще по умолчанию, так что не о чем беспокоиться. Существуют разные кодировки, потому что другие языки или операционные системы имеют другой порядок байтов.

Вы можете расширить оболочку, чтобы она "понимала" различные форматы GUID, очень полезное расширение в любом случае для всех видов отладки:

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

Это упрощает отладку с помощью оболочки. Просто скачайте js и запустите монго, используя mongo --shell uuidhelpers.js.

person mnemosyn    schedule 19.12.2011
comment
Чтобы драйвер не добавлял CSUUID, вы можете передать значение в виде строки, а не GUID. - person Andrew; 08.01.2014
comment
@ Андрей: Нет, нельзя. Это будет искать строки в базе данных, а CSUUID(someString) != someString. То же самое верно и для ObjectId. Кроме того, строки требуют значительно больше места для хранения, чем их байтовые представления. Более того, драйвер не «добавляет» CSUUID. CSUUID — это вспомогательный метод js, который позволяет вам легко создать такое же двоичное представление, которое используется в C#, из строки в JavaScript, поэтому метод ToString() драйвера имеет переопределение, поэтому то, что отображается в отладчике, можно использовать для запроса базы данных из команды линия. - person mnemosyn; 08.01.2014
comment
Я должен уточнить, я использую строковое представление для GUID в базе данных. - person Andrew; 09.01.2014