是否可以强制转换 MongoDB 查询?

发布于 2024-09-15 06:30:46 字数 591 浏览 6 评论 0原文

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

什么也不返回。

When I have two MongoDB documents like this...

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

The result of a query like:

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

is..

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

It's obvious, that a string comparison is made, so that my first value is not returned.
Is there any way to cast within the query?

Something like:

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

would be great. A query like

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

returns nothing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

同尘 2024-09-22 06:30:46

您可以使用以下 JavaScript 表达式

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

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

You can use the following JavaScript expression:

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

This uses JavaScript's automatic conversion from string to number.

仅冇旳回忆 2024-09-22 06:30:46

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

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

I have a similar workaround, i find that if you can use the mongo shell, you can write an statement to do this in javascript, but capable of using indexes.

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

If you want this to run faster than previus solution, you have to ensure the index on the value field.

深者入戏 2024-09-22 06:30:46

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

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

Test : mongoplayground

注意:

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

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

尽管这在当今很常见&很容易做到,但请记住,我们在每次读取时都会将 string 转换为 int,而不是如果您可以在写入或更新时处理此问题,那就很容易了更有效率。

Type casting in MongoDB is available after version >= 4.0. Check MongoDB's aggregation operator $convert and similar operators. Since you wanted to convert string to int you can use $toInt:

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

Test : mongoplayground

Note :

Here we're converting value which is a string field to int on the fly & Since it got converted to int - we're comparing it to input of type int. Your output documents will still have original type for value field which is string (we're not actually changing type in response docs, if needed use aggregation & it's stage $project to see int values for field value in response docs).

Since we're using aggregation operators in .find() we need to wrap everything in $expr.

Even though this is pretty common nowadays & is easy to do, but remember we're casting string to int on every Read, rather if you can take care of this on Writes or Updates it would be easy & more efficient.

无名指的心愿 2024-09-22 06:30:46

要将 String 转换为 int 使用 this

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} });

To convert String into int use this

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

And after that you can directly query like :

db.test.find({"value" :{$gt : 12} });
月下伊人醉 2024-09-22 06:30:46

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

$gt wasn't set for this use case. You would have to use regex for strings. Probably easier to just create a new field with the number as a number.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文