Как выполнить поиск между начальной датой и датой окончания в Pymongo [duplicate]

В Java эти конкретные классы реализуют интерфейс CharSequence:

CharBuffer, String, StringBuffer, StringBuilder

Эти конкретные классы не имеют общего родительский класс, отличный от Object, поэтому нет ничего, что связывало бы их, кроме того, что каждый из них имеет какое-то отношение к массивам символов, представляющих такие или манипулирующие такими. Например, символы String не могут быть изменены после создания экземпляра объекта String, тогда как символы StringBuffer или StringBuilder могут быть отредактированы.

Однако каждый из этих классов способен соответствующим образом реализовать методы интерфейса CharSequence :

char charAt(int index)
int length()
CharSequence subSequence(int start, int end)
String toString()

В некоторых случаях классы классов классов Java, которые использовали для приема String, были пересмотрены, чтобы теперь принять интерфейс CharSequence. Поэтому, если у вас есть экземпляр StringBuilder, вместо извлечения объекта String (что означает создание экземпляра нового объекта) вместо этого можно просто передать сам StringBuilder, поскольку он реализует интерфейс CharSequence.

Добавляемый интерфейс, который некоторые классы реализуют такую ​​же выгоду для любой ситуации, когда символы могут быть добавлены к экземпляру конкретного конкретного экземпляра объекта класса. Все эти конкретные классы реализуют интерфейс Appendable:

BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer

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 19 August 2018 в 16:38
поделиться
  • 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 19 August 2018 в 16:38
поделиться
  • 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 19 August 2018 в 16:38
поделиться

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

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

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

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

Я попытался в этой модели в соответствии с моими требованиями. Мне нужно сохранить дату, когда когда-либо создается объект. Я хочу получить все записи (документы) между двумя датами в моем 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 19 August 2018 в 16:38
поделиться

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

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

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

16
ответ дан Ben Smith 19 August 2018 в 16:38
поделиться

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

2
ответ дан Chris Seymour 19 August 2018 в 16:38
поделиться

используйте $ 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 19 August 2018 в 16:38
поделиться

Используйте этот код, чтобы найти запись между двумя датами, используя $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 19 August 2018 в 16:38
поделиться
  • 1
    Что это добавляет к принятому ответу, предоставленному 8 годами ранее? – Dan Dascalescu 22 July 2018 в 22:42

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

2
ответ дан ZacharyST 19 August 2018 в 16:38
поделиться
  • 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
Другие вопросы по тегам:

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