Добавление $ и и $ или запросов в структуру для запроса MongoDB - должен быть непустым массивом - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь объединить несколько запросов в один объект: пользователь может создавать запросы из предварительно выбранных опций и выбирать либо операторы «или», либо «или». Все запросы выводятся корректно, но когда их помещают в объект, я получаю сообщение «Ошибка: $ и / $ или / $ не должно быть непустым массивом».

Например, скажем, у нас есть запрос a AND b AND c ANDd И e вывод должен быть: {$ и [a, $ and: [b, $ and: [c, $ and: [d, e]]]]} это так, что если они выбирают другой оператор, операцияостается неизменным

Вот код:

function nestOps(ops, queries) {
  let queryObj = {};
  if (ops.length > 1) {
    let querySet = {};
    querySet[`$${ops[ops.length - 1]}`] = [queries[ops.length - 1], queries[ops.length]];
    for (let i = ops.length - 2; i > 0; i--) {
      let next = {};
      next[`$${ops[i]}`] = querySet;
      querySet = {};
      let nextIdx = i - 1;

      if (nextIdx > 0) {
        querySet[`$${ops[nextIdx]}`] = [queries[i], next];
        i--;
      }
      else {
        querySet = next;
      }
    }


    queryObj[`$${ops[0]}`] = [querySet, queries[0]];
  }
  else {
    queryObj[`$${ops[0]}`] = [...queries];
  }
  return queryObj;
}

Я пытался сделать это с помощью рекурсии, однако мой стек довольно раздутый (даже с увеличенным размером стека), и я не вижукак использовать метод хвоста («return nextCall ()»), так как я должен вернуть предыдущий запрос, отправленный или зарезервированный, и я не могу сделать это без присваивания первым.

Вот вывод консоли:

Output Object
$and: Array(2)
0:
  $and: Array(2)
  0: {questions: {…}}
  1:
   $and: // could be an error here but, I don't understand why
   $and: Array(2)
    0: {$or: Array(2)} //this happens due to a query, it is not an error
    1: {questions: {…}}
Operators
["and", "and", "and", "and"]

Queries
(5) [{…}, {…}, {…}, {…}, {…}]
  0: {questions: {…}}
  1: {completedAt: {…}}
  2: {questions: {…}}
  3: {$or: Array(2)}
  4: {questions: {…}}

1 Ответ

0 голосов
/ 28 октября 2019

Вместо создания вложенного $and вы можете упростить его, используя один $and.

{ property: { $and: [ {filter}, {filter} ] }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...