Запрос документов CouchDB между датой начала и датой окончания

Я пытался понять, как создать представление CouchDB, которое позволит мне запрашивать все документы, у которых дата начала больше A, а дата окончания меньше B.

Возможно ли это в CouchDB или другом хранилище документов noSQL? Должен ли я отказаться от него и вернуться к SQL?

Я просто пытаюсь сделать эквивалент SQL:

SELECT * WHERE [отметка времени начала] >= doc.start AND [отметка времени окончания] ‹ doc.end;


person Erk    schedule 09.07.2010    source источник
comment
Дублируйте, см. stackoverflow.com/questions/3079040/range- key-in-couchdb-views   -  person b_erb    schedule 10.07.2010
comment
@PartlyCloudy Я не понимаю, как этот вопрос является обманом вашего вопроса. Ваш вопрос генерирует набор событий через равные промежутки времени в некотором диапазоне, тогда как он ищет все значения в некотором диапазоне. Я мог просто неправильно использовать ваше решение, но я так не думаю.   -  person jfenwick    schedule 07.06.2011


Ответы (4)


Просто создайте карту следующим образом:

function (doc) {emit(doc.timestamp, 1)}

затем запросите представление с помощью:

?descending=true&limit=10&include_docs=true // Get the latest 10 documents

Представление будет отсортировано от самого старого к последнему, поэтому descending=true меняет этот порядок на противоположный.

Если вам нужен конкретный диапазон.

?startkey="1970-01-01T00:00:00Z"&endkey="1971-01-01T00:00:00Z"

доставит вам все в 1970 году.

Это должно помочь:

person mikeal    schedule 10.07.2010
comment
Это не сработает, потому что есть две разные переменные, doc.start и doc.end. - person jfenwick; 07.06.2011
comment
Вы представили анонимную функцию в качестве ответа, но она полностью вырвана из контекста, потому что вы не сказали, где и как ее разместить, или что ее назначить, или как или что ее вызывает. Я имею в виду, я могу назначить его переменной в документе? Я помещаю его в документ голым и неназначенным? Может быть, это вообще не входит в документ? Кто знает. - person ekerner; 13.02.2017
comment
Все ссылки на вики Apache сгнили. - person Paul; 20.04.2018

Используйте ключ массива в вашей функции карты

function (doc) {
  var key = [doc.start, doc.end]
  emit(key, doc)
}

Затем, чтобы получить документы с датой начала больше 1970-01-01T00:00:00Z и датой окончания до 1971-01-01T00:00:00Z, используйте запрос

?startkey=["1970-01-01T00:00:00Z", ""]&endkey=["\ufff0", "1971-01-01T00:00:00Z"]
person Noah    schedule 25.03.2013
comment
Какую магию делает здесь первая часть конечного ключа? ￰ Равна ли она дате в бесконечном будущем? - person mtnpaul; 21.09.2015
comment
@noah, похоже, это не отфильтровывает часть даты окончания, если дата начала совпадает, поэтому с ключом окончания - person wprater; 13.09.2017

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

Запрос манго может выглядеть так:

"selector": {
   "effectiveDate": {
      "$gte": "2000-04-29T00:00:00.000Z",
      "$lt": "2020-05-01T00:00:00.000Z"
   }
}
person Paul    schedule 21.10.2019

Используйте startkey и endkey. Таким образом, вы можете выбрать диапазон дат во время выполнения, не замедляя выполнение запроса.

person Umang    schedule 10.07.2010