Ответ 1
Вы можете использовать следующее выражение JavaScript:
db.test.find("this.value > 12")
Здесь используется автоматическое преобразование JavaScript из строки в число.
Когда у меня есть два файла 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"
ничего не возвращает.
Вы можете использовать следующее выражение JavaScript:
db.test.find("this.value > 12")
Здесь используется автоматическое преобразование JavaScript из строки в число.
У меня аналогичное обходное решение, я обнаружил, что если вы можете использовать оболочку 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);
}
Если вы хотите, чтобы это выполнялось быстрее, чем предыдущее решение, вы должны обеспечить индекс в поле значения.
$gt не был установлен для этого варианта использования. Вам нужно будет использовать регулярное выражение для строк. Вероятно, проще просто создать новое поле с номером в виде числа.
Чтобы преобразовать 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} });