MongoDB: возврат строк последовательно до и после данной строки?

В MongoDB , учитывая оператор find (), который возвращает курсор для набора строк, каков идиоматический и эффективный по времени способ возврата «контекстных» строк, т. е. строк последовательно до и / или после каждой строки в наборе?

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

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8

Это результат команды ack:

C:\temp>ack.pl -C 2 "line 4" test.txt
line 2
line 3
line 4
line 5
line 6

Я храню данные журнала в коллекции MongoDB, по одному документу на строку. Каждый журнал токенизируется на ключевые слова, и эти ключевые слова индексируются, что дает мне дешевый полнотекстовый поиск.

Я выполняю стандарт болота:

collection.find({keywords: {'$all': ['key1', 'key2']}}, {}).sort({datetime: -1});

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

  • Для каждой строки в курсоре:
    • Получить поле _id, сохранить в x.
    • выполнить: collection.find ({_ id: {'$ gt': x}}). Limit (N)
      • Получите результаты от каждого из этих курсоров.
    • выполнить: collection.find ({_ id: {'$ lt': x}}). Sort ({_ id: 1}). Limit (N)
      • Получите результаты от каждого из этих курсоров.

Для набора результатов с R строками требуется 2R + 1 запросов.

Однако я думаю, что могу обменять пространство на время. Есть ли реальная альтернатива обновлению каждой строки ее context _id в фоновом режиме? Для данной строки, в которой в настоящее время есть поля:

_id, contents, keywords

, я бы добавил дополнительное поле:

_id, contents, keywords, context_ids

, а затем в последующем поиске я мог бы каким-то образом использовать эти context_ids, я думаю? Я еще совсем не знаком с MongoDB MapReduce, но может ли это проявиться в картине?

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

Я ценю любые ответы, которые принимают объем вопроса. Я понимаю, что могу использовать Lucene или настоящую полнотекстовую поисковую систему вне диапазона, но я пытаюсь почувствовать грани и возможности MongoDB, поэтому я был бы признателен за ответы, специфичные для MongoDB. Спасибо!

5
задан Community 22 September 2017 в 17:57
поделиться