Условный запрос mongodb, превышающий $gt, возвращает нулевые результаты

У меня есть база данных mongodb, в которой есть коллекция пользователей, содержащая следующий документ

{
  "_id": ObjectId("5161446e03642eab4a818fcd"),
  "id": "35",
  "userInfo": {
  "name": "xyz",
  "rollNumber": 121
   }
}

Я хочу получить все строки, идентификатор которых больше определенного значения

@GET
@Path("/query")
@Produces({ MediaType.APPLICATION_JSON })
 public List<String> getLactionInfo(@QueryParam("from") int from) {
    BasicDBObject query = new BasicDBObject();
    // check if ids greater than 0
    query.put("id", new BasicDBObject("$gt", from));
    // get the collection of users
    DBCursor cursor = getTable("users").find(query);
    List<String> listUsers = new ArrayList<String>();
    while (cursor.hasNext()) {
        DBObject object = cursor.next();
        String id = cursor.next().get("_id").toString();
        object.put("_id", id);
        String objectToString = object.toString();
        listUsers.add(objectToString);

    }

    return listUsers;
}

Когда я отлаживал свой код, он показывал, что listUsers имеет значение null. Также, когда я вручную запускаю следующий запрос в консоли, я не получаю никаких результатов.

db.users.find({id:{$gt:60}})

person luckysing_noobster    schedule 14.04.2013    source источник


Ответы (1)


id в ваших примерах данных хранится как string. Итак, проверка $gt пытается сравнить integer с string.

Если вы переключите значение id на integer, оно должно работать, как и ожидалось.

Например:

db.test.insert( { "id": 40, "name": "wired" } )
db.test.insert( { "id": 60, "name": "prairie" } )
db.test.insert( { "id": 70, "name": "stack" } )
db.test.insert( { "id": 80, "name": "overflow" } )
db.test.insert( { "id": "90", "name": "missing" } )

Затем тест:

> db.test.find({"id": { "$gt": 60 }}).pretty()
{
        "_id" : ObjectId("516abfdf8e7f7f35107081cc"),
        "id" : 70,
        "name" : "stack"
}
{
        "_id" : ObjectId("516abfe08e7f7f35107081cd"),
        "id" : 80,
        "name" : "overflow"
}

Для быстрого исправления данных вы можете сделать что-то подобное из оболочки (вставить как одну строку и изменить myCollection на имя вашей коллекции:

db.myCollection.find().forEach(function(doc) { doc.id = parseInt(doc.id, 10); 
     db.test.save(doc); })
person WiredPrairie    schedule 14.04.2013
comment
Спасибо за всю помощь, с моей стороны было очень глупо пропустить что-то настолько тривиальное. - person luckysing_noobster; 15.04.2013