23

当我有两个这样的 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"

什么都不返回。

4

5 回答 5

24

您可以使用以下JavaScript 表达式

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

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

于 2010-08-19T12:26:25.820 回答
5

我有一个类似的解决方法,我发现如果你可以使用 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);
}

如果您希望它比以前的解决方案运行得更快,则必须确保 value 字段上的索引。

于 2013-01-16T01:48:50.030 回答
2

要将 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} });
于 2015-09-23T06:43:43.120 回答
1

MongoDB 中的类型转换在版本 >= 之后可用4.0。检查 MongoDB 的聚合运算符$convert和类似的运算符。既然你想转换stringint你可以使用$toInt

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

测试: mongoplayground

笔记 :

在这里,我们正在将value哪个string字段转换int为动态 & 因为它已转换为int- 我们将其与 type 的输入进行比较int。您的输出文档仍将具有value字段的原始类型string(我们实际上并没有更改响应文档中的类型,如果需要使用聚合和在响应文档$project中查看int字段值的阶段value)。

由于我们在其中使用聚合运算符,.find()我们需要将所有内容包装在$expr.

尽管这在当今很常见并且很容易做到,但请记住,我们会在每次读取时进行强制转换stringint而不是如果您可以在写入或更新时处理此问题,它会更容易且更有效。

于 2020-06-03T17:21:16.400 回答
0

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

于 2010-08-19T12:16:28.617 回答