2016-06-08 4 views
3

Контекст:

Мы используем Монго для сохранения информации сеанса на пользователей, посещающих сайты наших клиентов. Большинство из них - это просто метаданные сеанса (время начала, браузер, ОС, страна и т. Д.).MongoDB: запрашивая массивов для конкретного элемента последовательности

Одним из таких полей является незаметный массив «страниц». Которая состоит из последовательности веб-сайтов, заказанных при их посещении пользователем. Достаточно просто. Однако теперь мы оказываемся в неотложной необходимости фильтровать их по порядку, который они встречают в массиве относительно КАЖДОГО ДРУГОГО, а не просто в том случае, если они встречаются в массиве.

Пример:

Рассмотрим следующие страницы массив:

[ "A", "B", "C", "D", "E", "F", "G", "H" ] 

Есть ли способ в MongoDB для запроса скажем: «извлекать каждый документ из db.sessions.pages где B следуют непосредственно с и D. следуют прямо или косвенно G и вся последовательность заканчивается H

Повторим - этот пример должен передать запрос выше, а также:?

[ "D", "A", "B", "A", "B", "C", "H" ] 

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

+0

Что вы имеете в виду * D следует прямо или косвенно G *? Какова ваша версия MongoDB? – styvane

+0

Мы используем Mongo 3.2 на производстве. «Прямая»/«косвенная» функциональность была бы неплохо иметь, но это не обязательно для нашего сценария. Под «элементом B, за которым сразу следует элемент G», я имею в виду, что в массиве, представляющем последовательность веб-сайтов, существует, по меньшей мере, одна такая подпоследовательность, что если B находится в n-й позиции, то G находится на n + 1 , Под «элементом B, косвенно сопровождаемым элементом G», я имею в виду, что существует хотя бы одна такая подпоследовательность, что если B находится в n-й позиции, то G находится на n + k. Опять же, эта специфическая функциональность не имеет решающего значения, все остальное есть;) – Zardii

ответ

0

Это сложная задача, и даже в SQL при использовании CTE это не так просто, как кажется.

имхо это может быть сделано с помощью пользовательских JS

var requiredSequence = [a, b] 
var requiredElement = 'g' 
    db.collection.find({}).forEach(function (doc) { 
     var arrayLenght = doc.array.lenght; 
     for (var i = 0; i < arrayLenght - 1; i++) { 
      if (doc.array[i] === requiredSequence[0] && doc.array[i + 1] === requiredSequence[1]) { 
       if (doc.array.indexOf(requiredElement) > -1) { 
        // we have all criteria meet 
        printjson(doc); 
        break; 
       } 
      }) 
     } 
    }) 
+0

, поскольку я нахожусь в постели. У меня есть некоторые идеи, как улучшить алгоритм поиска массива, когда идея не является итерацией, но сначала ищет позицию индекса, а затем имеет совпадение для n + 1 ... – profesor79

Смежные вопросы