Проблема с драйвером MongoDB C # при выполнении запросов с использованием GuidRepresentation.Стандартный GuidSerializer

#c# #mongodb #mongodb-.net-driver

#c# #mongodb — монгодб #mongodb-.net-driver #mongodb

Вопрос:

Я использую драйвер MongoDB C # версии 2.11.0. Я знаю, что идентификаторы GUID обрабатывались по-разному каждым драйвером в прошлом, и теперь существует общий стандарт. Это не используется по умолчанию в драйвере C # по соображениям обратной совместимости. Текущая рекомендация, по-видимому, состоит в том, чтобы установить Guidepresentation в сериализаторе. Либо глобально, либо для каждого отображенного свойства Guid в отдельности.

Все в порядке, проблема, с которой я сталкиваюсь, заключается в том, что запросы к коллекциям не соответствуют настройкам сериализации и работают должным образом только при использовании устаревшего параметра MongoDefaults. Документы должным образом хранятся с использованием правильного GuidRepresentation, но запросы, похоже, пытаются сопоставить CSUUID, а не UUID, поэтому он никогда не совпадает с документом в базе данных.

Вот базовая карта классов:

 public static void RegisterClassMaps()
{
    BsonClassMap.RegisterClassMap<Widget>(cm =>
    {
        cm.MapIdProperty(w => w.Id)
            .SetSerializer(new GuidSerializer(GuidRepresentation.Standard));
        cm.MapProperty(w => w.ParentId)
            .SetSerializer(new GuidSerializer(GuidRepresentation.Standard));
        cm.MapProperty(w => w.Name);
    }
}
  

И вот простой запрос, соответствующий Guid и строке. Следующий метод всегда будет возвращать значение null, поскольку он строит запрос с использованием CSUUID, а не UUID.

 private readonly IMongoCollection<Widget> _collection;

public async Task<Widget> FindByNameAsync(Guid parentId, string name)
{
    var query = _collection.Find(w =>
        w.ParentId == parentId amp;amp;
        w.Name = name);
    return await query.SingleOrDefaultAsync();
}
  

Использование AsQueryable() вместо Find() приводит к тому же результату. Оба строят запрос, используя CSUUID, а не UUID.

Я также попытался настроить глобальный GuidSerializer на использование GuidRepresentation.Стандартный, но я получил те же результаты.

 BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
  

Если я изменю значение устаревшего свойства MongoDefaults, все будет работать совершенно нормально.

 MongoDefaults.GuidRepresentation = GuidRepresantion.Standard;
  

Я что-то упускаю из виду в том, как я строю свои запросы? Я бы предпочел избежать устаревшей настройки.

Комментарии:

1. Что говорится в документации драйвера об указании представления uuid или сериализаторов при запросе?

2. Проверьте это mongodb.github.io/mongo-csharp-driver/2.11/reference/bson /…

Ответ №1:

Возникла та же проблема.

Согласно http://mongodb.github.io/mongo-csharp-driver/2.11/reference/bson/guidserialization/guidrepresentationmode/guidrepresentationmode/

вам необходимо настроить GuidRepresentationMode до тех пор, пока в будущем по умолчанию не будет установлен V3

 BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;
  

Ответ №2:

 BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
  

BsonDefaults.GuidRepresentationMode помечен как устаревший, потому что в будущей версии драйвера мы удалим поддержку режима V2, и на этом этапе мы также удалим GuidRepresentationMode свойство из BsonDefaults .

https://jira.mongodb.org/browse/CSHARP-3195

Комментарии:

1. Проблема JIRA, которая, в частности, связана с этой ошибкой, заключается в jira.mongodb.org/browse/CSHARP-3179 — приведенное выше просто относится к устаревшему предупреждению

2. Эти две строки должны быть включены в mongodb.github.io/mongo-csharp-driver/2.11/reference/bson /… для большей ясности