Java-драйвер Mongo, как создать сложный запрос

1

Я тестирую базу данных с одним документом. В следующем коде я получаю следующий результат из базы данных

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 не охватывает эту конкретную структуру запросов в его учебнике, поэтому я прошу вас всех. благодаря

Теги:
database
mongodb-query

2 ответа

2
Лучший ответ

Вам нужно поставить свои аргументы запроса, ограничивающие результат, на ваш первый объект запроса. Второй объект - это проекция результата. Он может указывать только теги, которые будут отображаться (как 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".

  • 0
    спасибо за подробное объяснение, нигде не смог найти
3

Вы хотите поместить свои критерии в запрос, а не в список ключей, которые вы хотите вернуть:

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());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню