Агрегатный конвейер MongoDB - какой шаг удалил последний документ? - PullRequest
0 голосов
/ 30 апреля 2018

Предположим, что простая установка, в которой конвейер агрегации MongoDB состоит из двух основных шагов:

  1. соответствует разыскиваемым документам ($ match)
  2. проверка разрешений на документы ($ redact)

Это можно сделать как

db.thingies.aggregate(
   [
     { $match: { SOME_CONDITION } },
     { $redact: {
        $cond: {
           if: { SOME_PERMISSION_CHECK },
           then: "$$KEEP",
           else: "$$PRUNE"
         }
       }
     }
   ]
);

Теперь представьте, что вы выполняете этот двухэтапный конвейер, и результат пуст. Есть ли способ определить, было ли это:

  • a 404: NOT-FOUND (результат $ match был пустым?) Или
  • a 403: ЗАПРЕЩЕНО (результат $ redact был пуст)

Короче говоря, был ли достигнут пустой результат на этапе 1 или на этапе 2?

1 Ответ

0 голосов
/ 01 мая 2018

Три ответа, потому что немного неясно, что вы спрашиваете:

1: Если вы выполняете агрегирование в своей программе и хотите, чтобы ваша программа сразу знала, почему у агрегации был пустой вывод, тогда ответ отрицательный: агрегация не возвращает эту информацию, и сервер не хранит это. Вашей программе может потребоваться выполнить дополнительные запросы для запроса данных, чтобы выяснить, какие дальнейшие действия необходимо предпринять.

2: Если вы запрашиваете ретроспективный анализ того, почему конкретный прогон агрегации, в определенную дату и время выдал свой вывод, то нет: нет способа узнать конечно. Вам потребуется журнал всех этапов агрегирования, с полным набором результатов в конце каждого этапа ; и MongoDB не ведет такую ​​регистрацию (она была бы очень многословна и сложна в управлении).

3: Если вам нужен ретроспективный анализ того, почему конкретный прогон агрегации дал результат, и вы готовы и можете вручную восстановить данные по мере необходимости и вручную повторно выполнить запрос, затем отладьте его найти эффекты каждого этапа довольно просто: просто закомментируйте все этапы, кроме первого, и выполните агрегацию:

db.thingies.aggregate([
    { $match: { SOME_CONDITION } },
    // { $redact: { $cond: { if: { SOME_PERMISSION_CHECK }, then: "$$KEEP", else: "$$PRUNE" } } }
]);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...