Преобразование запроса Apache Derby в эквивалентный запрос MongoDB [дубликат]

Код для интерфейса. Не реализация не имеет отношения к Java, а также к конструкции интерфейса.

Эта концепция была выведена в известность в книгах «Шаблоны / Банды четырех», но, скорее всего, была вокруг нее задолго до этого. Концепция, безусловно, существовала задолго до того, как существовала Java.

Конструкция интерфейса Java была создана для помощи в этой идее (среди прочего), и люди стали слишком сосредоточены на конструкции как центр смысла, а не оригинальное намерение. Тем не менее, это причина, по которой у нас есть общедоступные и частные методы и атрибуты в Java, C ++, C # и т. Д.

Это означает просто взаимодействовать с открытым интерфейсом объекта или системы. Не беспокойтесь и даже не ожидайте, как он делает то, что он делает внутренне. Не беспокойтесь о том, как это реализовано. В объектно-ориентированном коде, поэтому мы имеем общедоступные и частные методы / атрибуты. Мы намерены использовать общедоступные методы, потому что частные методы существуют только для внутреннего использования внутри класса. Они составляют реализацию класса и могут быть изменены по мере необходимости без изменения открытого интерфейса. Предположим, что в отношении функциональности метод класса будет выполнять ту же операцию с тем же ожидаемым результатом каждый раз, когда вы вызываете его с теми же параметрами. Это позволяет автору изменять способ работы класса, его реализацию, не нарушая взаимодействия с ним.

И вы можете запрограммировать интерфейс, а не реализацию, не используя конструкцию интерфейса. Вы можете запрограммировать интерфейс, а не реализацию на C ++, которая не имеет конструкцию интерфейса. Вы можете интегрировать две огромные корпоративные системы гораздо надежнее, если они взаимодействуют через публичные интерфейсы (контракты), а не вызывают методы для объектов, внутренних для систем. Ожидается, что интерфейсы всегда будут реагировать на один и тот же ожидаемый путь с учетом тех же входных параметров; если реализован интерфейс, а не реализация. Концепция работает во многих местах.

Встряхните мысль о том, что Java-интерфейсы имеют что-то, что связано с концепцией «Программа для интерфейса, а не реализация». Они могут помочь применить концепцию, но это не концепция.

277
задан royhowie 11 August 2015 в 07:20
поделиться

10 ответов

Запрос в отношении диапазона дат (определенного месяца или дня) в Cookbook MongoDB имеет очень хорошее объяснение по этому вопросу, но ниже - это то, что я опробовал самостоятельно и это работает.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

Основываясь на моих экспериментах, вам нужно будет сериализовать ваши даты в формате, поддерживаемом MongoDB, потому что следующее дало нежелательные результаты поиска.

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

Во втором примере результаты не ожидались, но все же был получен один. Это связано с тем, что выполняется базовое сравнение строк.

430
ответ дан Dinei 20 August 2018 в 09:57
поделиться
  • 1
    Выглядит интересно, но хранимая дата должна быть в определенном формате. Я только что сохранил то, что было предоставлено Twitter, нужно ли это изменить в другом формате? – Tom 31 May 2010 в 17:24
  • 2
    Вероятно, вы сохранили временные метки как строки, поэтому я предполагаю, что MongoDB не поймет, что они на самом деле являются датами. Таким образом, выполнение запроса диапазона для них приведет к запросу в алфавитном диапазоне (например, «Ян Пн 01.01.2010» до «Ян Сун 01.01.1000»). Вероятно, было бы целесообразно форматировать все данные даты в формате MongoDB, который, я думаю, является просто простой датой JavaScript. – ponzao 31 May 2010 в 17:47
  • 3
    Я просто использовал это, чтобы преобразовать мои строки в современные объекты stackoverflow.com/questions/2900674/… – Tom 31 May 2010 в 22:07
  • 4
    ОК, круто! Я бы предположил, что запросы диапазона, упомянутые в кулинарной книге, должны работать тогда, вы уже пробовали их? – ponzao 31 May 2010 в 22:26
  • 5
    Да, когда я записывал даты, примеры поваренной книги работали, как ожидалось. – Tom 15 June 2010 в 09:46
db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count();

Замените collection именем коллекции, которую хотите выполнить запрос

6
ответ дан aldoWan 20 August 2018 в 09:57
поделиться
  • 1
    Что это добавляет к принятому ответу (предоставленному 7 годами ранее)? – Dan Dascalescu 22 July 2018 в 22:42
  • 2
    @DanDascalescu - может быть, это ничего не добавило, но что вас беспокоит? – GSK 23 July 2018 в 09:20
  • 3
    Дублированные ответы отнимают у людей время. – Dan Dascalescu 23 July 2018 в 19:43
  • 4
    если вам это не нравится, пожалуйста, проигнорируйте его, научитесь отпускать вещи, которые мой друг – GSK 24 July 2018 в 05:27

Python и pymongo

Поиск объектов между двумя датами в Python с pymongo в коллекции posts (на основе учебника ):

from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000)
to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000)

for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}):
    print(post)

Где {"$gte": from_date, "$lt": to_date} указывает диапазон в терминах типов datetime.datetime.

5
ответ дан Anton Tarasenko 20 August 2018 в 09:57
поделиться

Чтобы уточнить. Важно знать, что:

  • Да, вы должны передать объект Date Javascript.
  • Да, это должно быть ISODate friendly
  • Да, из моего опыта, чтобы это работало, вам нужно манипулировать датой ISO
  • Да, работает с датами, как правило, всегда утомительный процесс, а mongo не является исключением

. Вот рабочий фрагмент кода, где мы немного манипулируем датами для обеспечения Mongo (здесь я использую mongoose и хотите, чтобы результаты для строк, атрибут даты которых меньше (до) даты, заданной как параметр myDate), могут корректно обрабатывать:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
17
ответ дан arcseldon 20 August 2018 в 09:57
поделиться

Я попытался в этой модели в соответствии с моими требованиями. Мне нужно сохранить дату, когда когда-либо создается объект. Я хочу получить все записи (документы) между двумя датами в моем html-файле. Я использовал следующий формат: mm / dd / yyyy

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

    <script>
//jquery
    $(document).ready(function(){  
    $("#select_date").click(function() { 
    $.ajax({
    type: "post",
    url: "xxx", 
    datatype: "html",
    data: $("#period").serialize(),  
    success: function(data){
    alert(data);
    } ,//success

    }); //event triggered

    });//ajax
    });//jquery  
    </script>

    <title></title>
</head>

<body>
    <form id="period" name='period'>
        from <input id="selecteddate" name="selecteddate1" type="text"> to 
        <input id="select_date" type="button" value="selected">
    </form>
</body>
</html>

в моем файле py (python) я преобразовал его в «iso fomate» следующим образом

date_str1   = request.POST["SelectedDate1"] 
SelectedDate1   = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()

и сохранен в моей коллекции dbmongo с помощью «SelectedDate» «как поле в моей коллекции

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

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
0
ответ дан ayu for u 20 August 2018 в 09:57
поделиться

MongoDB фактически хранит миллины даты как int (64), как предписано http://bsonspec.org/#/specification

Однако, это может становится довольно запутанным, когда вы извлекаете даты, поскольку клиентский драйвер будет создавать экземпляр объекта даты с его собственным местным часовым поясом. Драйвер JavaScript в консоли mongo, безусловно, сделает это.

Итак, если вы заботитесь о своих часовых поясах, убедитесь, что знаете, что это должно быть, когда вы вернетесь. Это не должно иметь большого значения для запросов, поскольку оно все равно будет соответствовать одному и тому же int (64), независимо от того, в какой временной зоне находится объект даты (надеюсь). Но я бы определенно делал запросы с объектами фактической даты (не строки), и пусть драйвер делает свое дело.

16
ответ дан Ben Smith 20 August 2018 в 09:57
поделиться

Преобразуйте свои даты в часовой пояс GMT, когда вы набиваете их в Mongo. Таким образом, никогда не возникает проблема с часовым поясом. Затем просто сделайте математику в поле twitter / timezone, когда вы вытащите данные для презентации.

2
ответ дан Chris Seymour 20 August 2018 в 09:57
поделиться

используйте $ get и $ lt, чтобы найти данные даты в mongodb

var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD");
db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lt: new Date(tomorrowDate + "T23:59:59.999Z")}})
0
ответ дан KARTHIKEYAN.A 20 August 2018 в 09:57
поделиться

Используйте этот код, чтобы найти запись между двумя датами, используя $gte и $lt:

db.CollectionName.find({"whenCreated": {
    '$gte': ISODate("2018-03-06T13:10:40.294Z"),
    '$lt': ISODate("2018-05-06T13:10:40.294Z")
}});
2
ответ дан sɐunıɔןɐqɐp 20 August 2018 в 09:57
поделиться
  • 1
    Что это добавляет к принятому ответу, предоставленному 8 годами ранее? – Dan Dascalescu 22 July 2018 в 22:42

Почему бы не преобразовать строку в целое число формы YYYYMMDDHHMMSS? Каждое приращение времени создавало бы большее целое число, и вы могли бы фильтровать целые числа, а не беспокоиться о преобразовании в время ISO.

2
ответ дан ZacharyST 20 August 2018 в 09:57
поделиться
  • 1
    Потому что время не только происходит в моем местном часовом поясе. – Michael Cole 9 December 2016 в 18:32
  • 2
    Это становится кошмаром, когда вы начинаете конвертировать время в этот формат и из него. Если вы собираетесь сделать что-то подобное, по крайней мере, используйте возвращаемое значение из .getTime () из объекта даты JS. – nikk wong 10 April 2017 в 21:49
  • 3
    поэтому мы всегда храним данные в UTC – codewandler 10 July 2017 в 21:12
Другие вопросы по тегам:

Похожие вопросы: