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

rgr*_*oli 18 casting mongodb

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

db.test.insert( {"value" : "10123"} );
db.test.insert( {"value" : "160"} );
Run Code Online (Sandbox Code Playgroud)

查询的结果如:

db.test.find({"value" :{$gt : "12"} });
Run Code Online (Sandbox Code Playgroud)

是..

{ "_id" : ObjectId("4c6d1b92304326161b678b89"), "value" : "160" }
Run Code Online (Sandbox Code Playgroud)

很明显,进行了字符串比较,因此不会返回我的第一个值.有没有办法在查询中进行投射?

就像是:

db.test.find({ (int) "value" :{$gt : 12} });
Run Code Online (Sandbox Code Playgroud)

会很好.像这样的查询

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

没有回报.

Nie*_*est 20

您可以使用以下JavaScript表达式:

db.test.find("this.value > 12")
Run Code Online (Sandbox Code Playgroud)

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

  • 只是要小心,因为它不能使用索引 (8认同)
  • db.test.find("this.value > 12") 这对我来说不起作用,我尝试使用这个 db.test.find({$where: "this.value > 12"}) 现在它可以工作 (2认同)

Neo*_*cos 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);
}
Run Code Online (Sandbox Code Playgroud)

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