Я тестирую базу данных с одним документом. В следующем коде я получаю следующий результат из базы данных
BasicDBObject keys = new BasicDBObject();
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", "SH");
keys.put("NumShares", new BasicDBObject("$gte", 0) );
BasicDBObject empty = new BasicDBObject();
DBCursor cursor_02 = coll_tmp.find( empty, keys );
System.out.println( "<2> " + cursor_02.count());
while(cursor_02.hasNext()) {
System.out.println( "<2> " + cursor_02.next());
}
При этом будут распечатываться следующие данные
<2> { <id & oid> , "symbol" : "ESLR" , "Exchange" : "SH"}
Документ также имеет поле "NumShares", установленное на значение 2.34508872. Желая опробовать операторы $ gt, $ gte, $ lt, $ lte и $ ne, я добавлю строку кода после последней строки keys.put().
keys.put("Price", new BasicDBObject("$gte", 0) );
Этот код должен продолжать выбирать одиночный документ, так как поле NumShares действительно больше или равно нулю. Вместо этого я получаю следующую ошибку.
Can't canonicalize query: BadValue Unsupported projection option: NumShares: { $gte: 0 }
В конечном итоге цель состоит в том, чтобы иметь эквивалент MongoDB SQL-запроса "цена, цена, цена, цена, цена,
Я понимаю, что mkyong не охватывает эту конкретную структуру запросов в его учебнике, поэтому я прошу вас всех. благодаря
Вам нужно поставить свои аргументы запроса, ограничивающие результат, на ваш первый объект запроса. Второй объект - это проекция результата. Он может указывать только теги, которые будут отображаться (как true/1 или false/0), нет никаких других ограничений, таких как "$ lte". Помещая его на объект запроса, как в следующем, должно работать:
BasicDBObject keys = new BasicDBObject();
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", 1);
BasicDBObject search = new BasicDBObject();
search.put("Exchange", "SH");
search.put("numShares", new BasicDBObject("$gte", 0) );
DBCursor cursor_02 = coll_tmp.find(search, keys);
Кроме того, ключи от MongoDBs чувствительны к регистру. Поэтому, если ваш ключ "NumShares", вы не можете найти его, ища "numShares".
Вы хотите поместить свои критерии в запрос, а не в список ключей, которые вы хотите вернуть:
BasicDBObject keys = new BasicDBObject(); // will specify the returned fields (SELECT)
keys.put("symbol", 1 );
keys.put("price", 1 );
keys.put("Exchange", 1);
BasicDBObject query = new BasicDBObject(); // will select the documents you want (WHERE)
query.put("numShares", new BasicDBObject("$gte", 0) );
DBCursor cursor_02 = coll_tmp.find( query, keys );
System.out.println( "<2> " + cursor_02.count());
while(cursor_02.hasNext()) {
System.out.println( "<2> " + cursor_02.next());
}