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

Например. Допустим, у нас есть запрос a AND b AND c AND d AND e, результат должен быть: {$ and [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: {…}}
0
Pharez 28 Окт 2019 в 15:00
1
Почему бы не {$and: [all the options here]} вместо вложенного и? Я не уверен, что это допустимая операция $and.
 – 
Shihab
28 Окт 2019 в 15:05
Хм, я должен был подумать об этом раньше, я попробую и дам вам знать, спасибо!
 – 
Pharez
28 Окт 2019 в 15:15
Да, работает нормально, спасибо.
 – 
Pharez
28 Окт 2019 в 16:54
Ничего, если я создам для этого отдельный ответ? Это помогло бы мне расширить свой профиль.
 – 
Shihab
28 Окт 2019 в 16:55

1 ответ

Лучший ответ

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

{ property: { $and: [ {filter}, {filter} ] }}
0
Shihab 28 Окт 2019 в 16:59