假设我有一个包含两个属性的Collection:amount和amountreceived是小数。
我想写一个查询,它将从集合中返回符合金额大于收到金额标准的项目。
目前我有一个javascript函数,如下所示:
f = function() { return this.amount > this.amountreceived;}
我还有一个看起来像这样的集合集:
item1 : amount = 50, amountreceived = 0;
item2 : amount = 50, amountreceived = 25;
如果我运行db.MyCollection.find(f)
,则返回的唯一结果是item1。
关于为什么该查询不会返回两个结果的任何想法?
答案 0 :(得分:2)
我假设您正在使用C#驱动程序?由于BSON没有十进制数据类型,因此C#驱动程序必须以某种方式表示.NET十进制值。默认表示形式为字符串,这有利于不丢失任何精度,但对查询不利。
你也可以要求C#驱动程序存储.NET十进制值,因为BSON加倍,这会导致一些精度损失并且可能会溢出,但对于查询会很好。
答案 1 :(得分:1)
你确定你正确地这样做了吗?你在下面的例子中有一个反例吗?
这是我的示例测试脚本。 (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 }