Não tenho certeza do que exatamente você quer. Existem essencialmente dois tipos de atualizações no MongoDB:você pode executar uma atualização atômica , ou substitua o documento .
Substituir o documento geralmente é mais fácil , porque permite que você use operações C# padrão para realizar modificações e reavaliará as propriedades geradas e similares:
var user = new User { Name = "John Doe", Quests =
new Dictionary<string, Tuple<string, string>> {
{ "hoho", new Tuple<string, string>("A", "A-Item") } } };
users.InsertOneAsync(user).Wait();
user.Quests = new Dictionary<string, Tuple<string, string>> {
{ "hoho Modified", new Tuple<string, string>("B", "B-Item") } };
users.ReplaceOneAsync(p => p.Id == user.Id, user);
No entanto, às vezes é necessário usar modificadores atômicos, como
$push
, $pull
, $set
, $addToSet
, etc. devido a preocupações de simultaneidade. Geralmente, considero uma má ideia realizar operações complexas em objetos incorporados complexos dessa maneira, porque há uma grande probabilidade de a consistência do objeto (no sentido ACID, ou 'invariantes de objeto' ) não pode ser verificado. Suponha que um usuário não deva ter mais de 3 missões ativas por vez, quem garante que essa regra seja observada? Isso normalmente é responsabilidade do código, e invariantes complexos não podem ser verificados pelo banco de dados.
Se você ainda quiser usar esses operadores atômicos, sugiro que faça uma nova pergunta porque lá depende muito dos detalhes (o dicionário, por padrão, é serializado como um documento, a tupla como um array, e eles exigem modificadores atômicos diferentes no MongoDB). Por exemplo, para adicionar um novo item ao dicionário, use
$set
:users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));