У меня есть коллекция MongoDB («Пользователи»), которая содержит поле словаря («UserRegistrations»).
Определение поля:
BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
public Dictionary<string, UserRegistration> UserRegistrations = new Dictionary<string, UserRegistration>();
Это словарь, который состоит из ключа (String) и пользовательского объекта в качестве значения.
Вот как это отражается в MongoDB:
"UserRegistrations" : [{
"k" : "517ba4e1696b03108ccef51a",
"v" : {
"RegistrationDate" : ISODate("2013-07-21T18:57:42.589Z"),
"OtherInfo" : "123456test",
}
}],
Когда я использую $ AddToSet, в следующем примере:
IMongoQuery query = Query.EQ("_id", new ObjectId(uid));
var kvp = new KeyValuePair<string, UserRegistration>("517ba4e1696b03108ccef51a", new UserRegistration()
{
RegistrationDate = DateTime.Now.ToUniversalTime(),
});
IMongoUpdate update = Update.AddToSet("UserRegistrations", kvp.ToBsonDocument());
collection.Update(query, update, UpdateFlags.Multi);
Он не проверяет, если тот же ключ уже существует, вызывая дублирование в поле словаря, которое впоследствии вызывает ошибки десериализации в драйвере C# MongoDB.
Как я могу убедиться, что один и тот же ключ уже не существует?
Спасибо!
Привет, спасибо за ответ, но это не то, что я искал. Разделение коллекции на другую коллекцию «UserRegistrations» является встречной методологией NoSQL, которая впоследствии потребует дорогостоящей индексации. Мне не нужно 16mb, на самом деле около 1mb более чем достаточно, чтобы это не было для меня. Другой способ редактирования документа в моем приложении тоже не подходит для меня, этот метод можно назвать асинхронным, если первый вызов получает текущий документ, а второй вызов получает его тоже, в то же время данные будут конфликтующими. Что мне нужно - это решение MongoDB (AddToSet или подобное). – mnnsx
+1 Спасибо, помог мне! – Aaron