#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:
Возникла та же проблема.
вам необходимо настроить GuidRepresentationMode до тех пор, пока в будущем по умолчанию не будет установлен V3
BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;
Ответ №2:
BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;
BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
BsonDefaults.GuidRepresentationMode
помечен как устаревший, потому что в будущей версии драйвера мы удалим поддержку режима V2, и на этом этапе мы также удалим GuidRepresentationMode
свойство из BsonDefaults
.
Комментарии:
1. Проблема JIRA, которая, в частности, связана с этой ошибкой, заключается в jira.mongodb.org/browse/CSHARP-3179 — приведенное выше просто относится к устаревшему предупреждению
2. Эти две строки должны быть включены в mongodb.github.io/mongo-csharp-driver/2.11/reference/bson /… для большей ясности