2011-03-14 7 views
1

Disons que j'ai une Collection avec deux propriétés: amount et amountreceived qui sont des nombres décimaux.MongoDB requête avancée

Je veux écrire une requête qui retournera des éléments de la collection qui répondent aux critères du montant étant supérieur au montant reçu.

Actuellement, j'ai une fonction javascript qui ressemble à ceci:

f = function() { return this.amount > this.amountreceived;} 

J'ai aussi un ensemble de collection qui ressemble à ceci:

item1 : amount = 50, amountreceived = 0; 
item2 : amount = 50, amountreceived = 25; 

Si je cours db.MyCollection.find(f) le seul résultat retourné est Item1 .

Des idées sur pourquoi cette requête ne retournera pas les deux résultats?

+0

Est-ce que quelqu'un pense que cela a quelque chose à voir avec la façon dont le pilote stocke une décimale? – strickland

Répondre

2

Je suppose que vous utilisez le pilote C#? Comme BSON n'a pas de type de données décimal, le pilote C# doit représenter la valeur décimale .NET d'une manière ou d'une autre. La représentation par défaut est une chaîne, ce qui est bon pour ne perdre aucune précision mais mauvais pour faire des requêtes.

Vous pouvez également demander au pilote C# de stocker les valeurs décimales .NET sous forme de doubles BSON, ce qui impliquerait une perte de précision et pourrait déborder, mais serait utile pour les requêtes.

+0

Merci pour la réponse, je vais juste stocker un booléen pour indiquer cette logique. – strickland

1

Etes-vous sûr de faire cela correctement? Avez-vous un contre-exemple pour mon exemple ci-dessous?

Voici mon exemple de script de test où cela fonctionne. (db.foo est vide)

MongoDB shell version: 1.6.5 
connecting to: test 
> db.foo.insert({_id : 1, amount : 50, amtreceived : 100 }) 
> db.foo.insert({_id : 2, amount : 50, amtreceived : 25 }) 
> db.foo.insert({_id : 3, amount : 50, amtreceived : 0 }) 
> db.foo.find() 
{ "_id" : 1, "amount" : 50, "amtreceived" : 100 } 
{ "_id" : 2, "amount" : 50, "amtreceived" : 25 } 
{ "_id" : 3, "amount" : 50, "amtreceived" : 0 } 
> f = function() { return this.amount > this.amtreceived; } 
function() { 
    return this.amount > this.amtreceived; 
} 
> db.foo.find(f) // expect 2 & 3 
{ "_id" : 2, "amount" : 50, "amtreceived" : 25 } 
{ "_id" : 3, "amount" : 50, "amtreceived" : 0 } 
+0

J'ai effectué le même test avant d'envoyer et cela a fonctionné. Je pense maintenant que cela a quelque chose à voir avec la façon dont le pilote stocke une décimale. – strickland

+0

J'utilise le pilote ici: https://github.com/mongodb/mongo-csharp-driver – strickland