Можно ли привести в MongoDB-Query? - PullRequest
18 голосов
/ 19 августа 2010

Когда у меня есть два таких документа 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 ]

20 голосов
/ 19 августа 2010

Вы можете использовать следующее выражение JavaScript :

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

При этом используется автоматическое преобразование JavaScript из строки в число.

4 голосов
/ 16 января 2013

У меня есть похожий обходной путь, я считаю, что если вы можете использовать оболочку mongo, вы можете написать заявление для этого в 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);
}

Если вы хотите, чтобы это работало быстрее, чем предыдущее решение, вы должны обеспечить индекс в поле значения.

1 голос
/ 23 сентября 2015

Чтобы преобразовать строку в 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} });
0 голосов
/ 19 августа 2010

$ gt не было установлено для этого варианта использования. Вы должны будете использовать регулярные выражения для строк. Вероятно, проще просто создать новое поле с номером в виде числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...