当我有两个像这样的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"
什么都不返回。
答案 0 :(得分:20)
答案 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上解决这个问题会更容易且更有效。