2013-04-14 2 views
1

У меня есть база данных 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}}) 

ответ

1

The 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); }) 
+0

Спасибо за помощь, мне было очень глупо пропустить что-то, что t rivial. –