2010-08-19 58 views
18

当我有两个MongoDB的文件,像这样...是否可以投入MongoDB-Query?

db.test.insert({"value" : "10123"}); 
db.test.insert({"value" : "160"}); 

像一个查询的结果:

db.test.find({"value" :{$gt : "12"} }); 

是..

{ "_id" : ObjectId("4c6d1b92304326161b678b89"), "value" : "160" } 

很明显,一个字符串进行比较,以便我的第一个值不返回。 在查询中有什么方法可以投射吗?

喜欢的东西:

db.test.find({ (int) "value" :{$gt : 12} }); 

将是巨大的。查询如

db.test.find({"value" :{$gt : 12} }); // without the quotes around "12" 

什么也没有返回。

+2

是否有你存储整数为字符串理由吗? db.test.insert({“value”:10123})不会更好。 – 2010-08-19 12:22:22

+0

当然,这是真的..在我的应用程序中,我收集formvalues并将它们传递给Mongo。 POST和GET值默认是字符串类型的。我怀疑司机会照顾型号转换。不幸的是,情况并非如此。所以你是对的,我在插入前转换数据。 此外,@niels提出了一个很好的观点...使用javascript表达式实际上解决了这个问题。 – rgroli 2010-08-19 15:07:51

回答

19

您可以使用以下JavaScript expression

db.test.find("this.value > 12") 

它使用JavaScript的自动转换从字符串到数字。

+0

不错!这解决了非常优雅的问题。 – rgroli 2010-08-19 15:12:06

+8

只是要小心,因为不能使用索引 – mstearn 2010-08-20 16:06:27

+1

这是否仍然有效?看起来像是不工作的数组元素 – 2015-02-13 13:19:32

0

$ gt没有被设置为这个用例。你将不得不使用正则表达式来处理字符串。用数字作为数字创建一个新的字段可能更容易。

4

我有一个类似的解决方法,我发现如果你可以使用mongo shell,你可以写一个语句来做到这一点在JavaScript中,但能够使用索引。

var myItems = [] 
var it = db.test.find({},{value:1}) 
while (it.hasNext()){ 
var item = it.next(); 
if(parseInt(item.value) > 12) 
    myItems.push(item); 
} 

如果您希望此操作比previus解决方案运行得更快,您必须确保值字段上的索引。

+0

这并不真正使用索引为你真正需要的索引 – casey 2013-12-10 20:34:33

1

至字符串转换为INT使用本

db.test.find({'year': {$type: 2}}).forEach(
    function (x) { 
     x.value=new NumberInt(x.value); 
     db.test.save(x)} 
    ) 

之后,你可以直接查询,如:

db.test.find({"value" :{$gt : 12} });