Различие между ISODates в каждом документе?

Действительно ли возможно вычислить различие между двумя датами в документе серверная сторона , и вопрос на нем? (Как SQL's DATEDIFF функция)

Предположите, что у меня есть много документов как это:

>>> db.collection.find()
[
    { "id" : ObjectId("1"), 
      "starttime" : ISODate("2011-12-01T05:01:00"), # 5:01 AM
      "endtime" : ISODate("2011-12-01T05:02:00")    # 5:02 AM 
    }, 

    { "id" : ObjectId("2"), 
      "starttime" : ISODate("2011-12-01T06:01:00"), # 6:01:00 AM
      "endtime" : ISODate("2011-12-01T06:01:30")    # 6:01:30 AM 
    }
]

Есть ли способ достигнуть чего-то подобного этому?

Возвращение просто разница во времени:

>>> db.collection.date_difference_seconds(endtime, starttime)
[60, 30]

или вопрос:

>>> db.collection.find("timediff(endtime-starttime) < 40 seconds")
[
    { "id" : ObjectId("2"), ...} # Just second document (30s diff)
]

Я читал о серверная сторона JS и , оценка() , но доктора говорит их, не рекомендуется - действительно ли они - наилучший вариант?


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

Клиентский calc:

>>> for doc in (collection.find(None, {'starttime': 1, 'endtime': 1 }))
        doc['endtime']-doc['startime']
0:01:00.000000
0:00:30.000000
1
nl ja de
Я предполагаю, что, чтобы сделать это необходимо знать разницу во времени, на которой вы хотите подвергнуть сомнению? Итак, почему не только подвергают сомнению различными датами и вычисляют клиентскую сторону различия?
добавлено автор Sammaye, источник
Хорошо на самом деле я понимаю что вашу попытку сделать: db.collection.find ("timediff (endtime-starttime) <40 секунд") я думал, что это было более просто, но я didn' t думают достаточно об этом. Хм, есть возможность использования $where сюда добавление времени calc функция, к которой, это избежало бы оценки, но это серьезно уменьшит скорость. Я думаю это, если необходимо было использовать функцию скопления, чтобы сделать новую вычисленную область, используя docs.mongodb.org/manual/reference/aggregation/#date-operator‌ ​ s
добавлено автор Sammaye, источник
Хорошо действительно отдельная область - ваш оригинальный ответ, таким образом, необходимо, вероятно, ответить:), что после некоторого разговора вы решили пойти с оригинальной идеей
добавлено автор Sammaye, источник
MongoDB doesn' у t есть эквивалент. Так, если it' s частый вопрос, просто предварительно вычислите его, как вы предположили и магазин в дополнительной области. Вы могли добавить индекс и вид, и т.д. тот путь (в случае необходимости). Или возможно функция MapReduce, но область была бы более простой.
добавлено автор WiredPrairie, источник
@Sammaye I' m не уверенный я следую. I' m только заинтересованный различием между датами, не самими датами. Сделайте вы имеете в виду что-то как отрывок I' ve добавляется к моему вопросу?
добавлено автор Alex L, источник
@Sammaye Это похоже на вычисление разницы во времени, используя операторов данных о скоплении, был бы довольно сложен, я думаю, что дополнительная область - способ пойти. (I' m использовал молитву не повторяющихся данных из RDBs). Парни аплодисментов - если кто-то суммирует все это ответ тогда I' ll принимают его.
добавлено автор Alex L, источник
Я don' t думают there' s специальный метод сделать это разъединяют сторону, но это может быть сделано в одной клиентской стороне заявления. Например: карта (лямбда x: (x [' endtime'] - x [' starttime']) .total_seconds (), db.collection.find ())
добавлено автор Brian Cajes, источник

1 ответы

Как предложено Sammaye, я думаю, что единственным способом сделать это является с совокупностью() функция. Например, выполнение чего-то как:

db.collection.aggregate([{$project: {timediff: {$subtract: ['$endtime' , '$starttime']}}}])

Вы по существу определяете новое поле времени выполнения, "timediff", который вычисляется прочь существующих данных. Необходимо тогда быть в состоянии добавить , $match ступают в трубопровод, чтобы отфильтровать на различии:

db.collection.aggregate([{$project: {timediff: {$subtract: ['$endtime' , '$starttime']}}}, {$match: {timediff: {$lte: 40}}}])

Я не попробовал этот определенный пример, таким образом, могло бы быть несколько недостающих скоб или скобок..., но надо надеяться вы получаете идею. Структура скопления довольно сильна с точки зрения трубопроводов данных, которые можно определить.

Удачи!

3
добавлено
Просто комментарий об этом. $lte: 40 не 40 секунд, по крайней мере ток mongodb версия I' m использующий в данный момент возвращает миллисекунды. Таким образом, это должен быть $lte: 40000, чтобы получить различие 40 секунд
добавлено автор Maximiliano Rios, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

MongoDB Russian
MongoDB Russian
1 086 участник(ов)

> db.stats() https://combot.org/chat/-1001035023078

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community