MongoDB расширенный запрос - PullRequest
1 голос
/ 14 марта 2011

Допустим, у меня есть Коллекция с двумя свойствами: сумма и сумма получения, которые являются десятичными.

Я хочу написать запрос, который будет возвращать элементы из коллекции, которые соответствуют критериям суммы, превышающейсумма получения.

В настоящее время у меня есть функция JavaScript, которая выглядит следующим образом:

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

У меня также есть набор сбора, который выглядит следующим образом:

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

ЕслиЯ запускаю db.MyCollection.find(f), единственный возвращаемый результат - item1.

Есть идеи, почему этот запрос не будет возвращать оба результата?

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

Я предполагаю, что вы используете драйвер C #?Поскольку BSON не имеет десятичного типа данных, драйвер C # должен каким-то образом представлять десятичное значение .NET.Представлением по умолчанию является строка, которая хороша, чтобы не потерять какую-либо точность, но плохо для выполнения запросов.

Вы также можете попросить драйвер C # хранить десятичные значения .NET как удвоенные значения BSON, что может привести к некоторой потереточности и может переполниться, но было бы хорошо для запросов.

1 голос
/ 14 марта 2011

Вы уверены, что делаете это правильно? У вас есть контрпример для моего примера ниже?

Вот мой пример тестового скрипта, где это работает. (db.foo пусто)

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 }
...