2011-01-25 3 views
1

Disons que j'ai un document entier.Comment changer de type dans MongoDB?

Lorsque je tente de définir la valeur à 3,5, il reste encore entier:

db.users.update({}, {$set:{balance:3.5}}) 

Comment puis-je changer pour flotter/décimal?

+0

Quel pilote utilisez-vous? –

+0

2 questions: # 1: * avez-vous vraiment l'intention de tout mettre à jour *? Si oui, vous n'utilisez pas le drapeau multiple, pourquoi pas? # 2: faites-vous cela à partir de la coque d'un pilote? Si c'est un pilote, nous aurons besoin de savoir quel pilote. –

Répondre

1

Je viens de faire quelques exemples C#:

public class Test 
    { 
     [BsonId] 
     public string Id { get; set; } 

     public int SomeIntegerField { get; set; } 
    } 

    [TestMethod] 
    public void TypesTest() 
    { 
     var db = MongoRead.Instance; 
     var collection = db.Database.GetCollection("test"); 
     var id = Guid.NewGuid().ToString(); 
     var test = new Test() { SomeIntegerField = 5, Id = id }; 
     collection.Insert(test); //here type of SomeIntegerField in mongodb Integer 

     //but after update type become Float64 
     collection.Update(Query.EQ("_id", id), Update.Set("SomeIntegerField", 3.5)); 
    } 

Mais si vous essayez de automatiquement desirialize classe de test de retour après la mise à jour il jette une erreur, car le type de SomeIntegerField sera Float64. Donc, pour de telles situations, je suggère d'écrire des tests unitaires.

J'espère que cela vous aidera.

+0

Le désérialiseur lancera une exception TruncationException dans ce cas car la valeur stockée dans la base de données ne peut pas être stockée dans une propriété Int32 sans perte de précision. Si vous souhaitez que la valeur soit désérialisée sans exception en tronquant la valeur 3.5 à 3, vous pouvez ajouter un attribut à SomeIntegerField: [BsonRepresentation (BsonType.Int32, AllowTruncation = true)]. –

1

Veuillez vérifier la syntaxe update(). Le premier paramètre de update() est toujours THE QUERY et non la clause UPDATE.

+0

Vous avez raison. C'était une faute de frappe. J'ai utilisé le bon dans ma requête. – Alex

Questions connexes