2014-07-09 1 views
0

J'essaie de définir un ensemble de champs à la valeur Max entre la valeur actuelle et la nouvelle valeur.

Je pense faire

UpdateBuilder<ADocument> update = Update<ADocument> 

.SetMax (d => d.HighScore, highScore) 
.SetMax (d => d.MaxGameTime, gameTime) 
.SetMax (d => d.MaxLevels, levels); 

Etc .. Mais il n'y a pas .SetMax, ou non .Max - qui utiliserait le mot-clé max $ pour le définir.

Alors, comment faites-vous cela? Je ne veux pas créer 3 requêtes (6 dans mon exemple réel) pour demander le Max highScore et le définir si .GE, et répéter pour chacun des autres champs.

Merci

+0

Avez-vous besoin https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB. Driver/MongoCursor.cs # L461-L466 –

+0

dans 2.6 il y a un opérateur $ max pour la mise à jour. Comme il s'agit d'un nouvel opérateur, vous devez utiliser la dernière version du pilote C# pour pouvoir utiliser SetMax que @MatijaGrcic vous a correctement indiqué. –

+0

On dirait que la base de données est 2.4.9 - donc je présume que cela signifie qu'il n'est pas supporté? Et nous exécutons 1.8.3.9 du pilote C#. Nous devons donc mettre à jour pour que cela fonctionne? –

Répondre

0

Soutien au max $ et min $ opérateurs a été ajouté au pilote C# dans la version 1.9.0 du pilote C#. Vous devez utiliser au moins cette version du pilote C# pour utiliser UpdateBuilder afin de créer des spécifications de mise à jour incluant Max ou Min.

Les nouveaux constructeurs de la méthode de mise à jour sont ici:

https://github.com/mongodb/mongo-csharp-driver/blob/v1.x/MongoDB.Driver/Builders/UpdateBuilder.cs#L269

Ce ne sont pas les mêmes que l'SetMax et SetMin sur les curseurs, qui sont un autre type de Max et Min. La méthode la plus simple pour accéder à ces opérateurs de mise à jour consiste à mettre à jour la dernière version du pilote C#. Pour contourner ce problème, vous pouvez construire la spécification de mise à jour en utilisant des techniques de niveau inférieur comme suit:

var update = new UpdateDocument 
{ 
    { "$max", new BsonDocument 
     { 
      { "HighScore", highScore }, 
      { "MaxGameTime", gameTime }, 
      { "MaxLevels", levels } 
     } 
    } 
}; 
+0

Donc, cela va les mettre à jour seulement s'ils sont plus élevés que le précédent? –