Как сопоставить массив по порядку с промежуточными элементами с помощью агрегации MongoDB - PullRequest
0 голосов
/ 28 мая 2020

У меня есть документы с массивом объектов событий:

  {
    "events": [
      {
        "name": "A"
      },
      {
        "name": "C"
      },
      {
        "name": "D"
      },
      {
        "name": "B"
      },
      {
        "name": "E"
      }
    ]
  },
  {
    "events": [
      {
        "name": "A"
      },
      {
        "name": "B"
      },
      {
        "name": "S"
      },
      {
        "name": "C"
      }
    ]
  }
] 

В этом массиве я хочу подсчитать количество событий, которые находятся в указанном порядке, с промежуточными событиями. Например, я ищу порядок [A, B, C] с массивом [A, x, x, B, x], я должен считать 2, с [A, B, x, x, C] я должен иметь 3. (x - это просто заполнитель для всего остального)

Я хочу суммировать эту информацию для всех моих документов в форме массива с количеством совпадений для каждого элемента. В предыдущем примере, который дал бы мне [2,2,1], 2 совпадения для A, 2 совпадения для B, 1 совпадение для C.

Моя текущая агрегация создается в javascript и следуйте этот шаблон:

  • Сопоставьте документы с массивом событий, содержащим A
  • Разделите массив от A до конца массива
  • Подсчитайте количество документов
  • Добавить количество совпадающих документов к суммирующему массиву
  • Сопоставить документы с массивом событий, содержащим B
  • Нарезать массив от B до конца массива
  • Подсчитать количество документов
  • et c

Однако, когда событие не появляется ни в одном из массивов, оно падает, так как документов нет, я нет возможности хранить суммирующий массив. Например, с массивом событий [A, x, x, B, x] [A, B, x, x, C] и попыткой сопоставить [A, B, D] я ожидал бы [2,2,0 ], но у меня есть [], так как при попытке сопоставить D ничего не появляется, и агрегирование не может продолжаться.

Вот агрегирование, с которым я работаю: https://mongoplayground.net/p/rEdQD4FbyC4 измените сопоставление буквы l.75 с чем-то не в массиве, чтобы иметь c поведение.

Итак, есть ли способ не потерять мои данные, если совпадений нет? вроде обхода этапов агрегации, я не смог найти ничего, связанного с обходом этапов в документации mongoDB.

Или вам известен другой способ сделать это?

1 Ответ

0 голосов
/ 02 июня 2020

Мы закончили использование сокращения для решения нашей проблемы

Сокращение относится к массиву событий, и с каждым событием мы пытаемся сопоставить его с элементом в последовательности в позиции «размер аккумулятора», если это совпадение, которое добавлено в аккумулятор, иначе нет, et c

вот это пн go площадка: https://mongoplayground.net/p/ge4nlFWuLsZ \

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