MongoDB: запрос с использованием $gte и $lte в java

Я хочу выполнить запрос к полю, которое больше или равно, И меньше или равно (кстати, я использую java). Другими словами. >= и ‹=. Насколько я понимаю, в mongoDB есть операторы $gte и $lte, но я не могу найти подходящий синтаксис для их использования. Поле, к которому я обращаюсь, является полем верхнего уровня.

Мне удалось заставить это работать:

FindIterable<Document> iterable = db.getCollection("1dag").find(new Document("timestamp", new Document("$gt", 1412204098)));

а так жопа...

FindIterable<Document> iterable = db.getCollection("1dag").find(new Document("timestamp", new Document("$lt", 1412204098)));

Но как их совместить друг с другом?

В настоящее время я играю с таким утверждением, но оно не работает:

FindIterable<Document> iterable5 = db.getCollection("1dag").find(new Document( "timestamp", new Document("$gte", 1412204098).append("timestamp", new Document("$lte",1412204099))));

Любая помощь?


person kongshem    schedule 29.09.2015    source источник


Ответы (2)


В основном вам требуется запрос диапазона, подобный этому:

db.getCollection("1dag").find({
    "timestamp": {
        "$gte": 1412204098,
        "$lte": 1412204099
    }
})

Поскольку для этого запроса диапазона вам нужно несколько условий запроса, вы можете указать логическую конъюнкцию (И), добавив условия к документу запроса, используя append():

FindIterable<Document> iterable = db.getCollection("1dag").find(
        new Document("timestamp", new Document("$gte", 1412204098).append("$lte", 1412204099)));
person chridam    schedule 29.09.2015

Конструктор new Document(key, value) дает вам документ только с одной парой ключ-значение. Но в этом случае вам нужно создать документ с более чем одним. Для этого создайте пустой документ, а затем добавьте в него пары с .append(key, value).

Document timespan = new Document();
timespan.append("$gt", 1412204098);
timespan.append("$lt", 1412204998);
// timespan in JSON: 
// { $gt: 1412204098, $lt: 1412204998}
Document condition = new Document("timestamp", timespan);
// condition in JSON:
// { timestamp: { $gt: 1412204098, $lt: 1412204998} }

FindIterable<Document> iterable = db.getCollection("1dag").find(condition);

Или, если вы действительно хотите сделать это с помощью одной строки без временных переменных:

FindIterable<Document> iterable = db.getCollection("1dag").find(
    new Document()
        .append("timestamp", new Document()
             .append("$gt",1412204098)
             .append("$lt",1412204998)
        )
);
person Philipp    schedule 29.09.2015
comment
В вашем однострочнике были синтаксические ошибки, но ваше решение работает. Хотя время выполнения было медленнее, чем принятый ответ. Спасибо, в любом случае! - person kongshem; 30.09.2015
comment
@kongshem Не могли бы вы предложить редактирование, чтобы исправить эти синтаксические ошибки? - person Philipp; 30.09.2015
comment
Я на нем, но похоже, что оператор : вызывает проблемы. Или, возможно, создание пустых документов с помощью функции .append. - person kongshem; 30.09.2015
comment
Действительно, это был оператор :. Используя , решил это. Время выполнения моего сбора данных по-прежнему на полсекунды медленнее. (700 МБ тестовых данных, я собираюсь использовать их до 1 ТБ). Я отредактирую ваш ответ. - person kongshem; 30.09.2015