是否可以在MongoDB-Query中进行转换?

时间:2010-08-19 12:10:44

标签: mongodb casting

当我有两个像这样的MongoDB文件时......

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"

什么都不返回。

5 个答案:

答案 0 :(得分:20)

您可以使用以下JavaScript expression

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

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

答案 1 :(得分: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解决方案运行得更快,则必须确保值字段上的索引。

答案 2 :(得分:1)

要将String转换为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} });

答案 3 :(得分:0)

$ gt没有为此用例设置。你必须使用正则表达式的字符串。使用数字作为数字创建一个新字段可能更容易。

答案 4 :(得分:0)

版本> = 4.0之后,可以使用MongoDB中的类型转换。检查MongoDB的聚合运算符$convert和类似的运算符。由于您想将string转换为int,因此可以使用$toInt

db.collection.find({ $expr: { $gt: [ { $toInt: "$value" }, 12 ] } })

测试: mongoplayground

注意:

在这里,我们正在将value字段string即时转换为int,由于它已转换为int-我们正在将其与输入进行比较int类型的。您的输出文档仍将具有value字段的原始类型,即string(我们实际上并没有在响应文档中更改类型,如果需要,请使用汇总,并且在阶段$project中查看{{响应文档中字段int的1}}值。

由于我们在value中使用了聚合运算符,因此我们需要将所有内容包装在.find()中。

尽管这在当今很普遍并且很容易实现,但是请记住,我们在每次读取时都将$expr投射到string上,如果您可以在Writes或Updates上解决这个问题会更容易且更有效。