Я пытался понять, как создать представление CouchDB, которое позволит мне запрашивать все документы, у которых дата начала больше A, а дата окончания меньше B.
Возможно ли это в CouchDB или другом хранилище документов noSQL? Должен ли я отказаться от него и вернуться к SQL?
Я просто пытаюсь сделать эквивалент SQL:
SELECT * WHERE [отметка времени начала] >= doc.start AND [отметка времени окончания] ‹ doc.end;
Ответ 1 · рейтинг 8 · mikeal
Просто создайте карту следующим образом:
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 году.
Это должно помочь:
- http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views
- http://wiki.apache.org/couchdb/HttpViewApi
- http://wiki.apache.org/couchdb/View_collation
Ответ 2 · рейтинг 3 · Noah
Используйте ключ массива в вашей функции карты
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"]
Ответ 3 · рейтинг 2 · Paul
Я искал то же самое и наткнулся на этот вопрос. С CouchDB 2.0 или более поздней версии у вас есть возможность использовать запросы Mango, которые включают больше и меньше чем.
Запрос манго может выглядеть так:
"selector": {
"effectiveDate": {
"$gte": "2000-04-29T00:00:00.000Z",
"$lt": "2020-05-01T00:00:00.000Z"
}
}