MongoDB: добавление полей на основе запроса частичного совпадения - выражение против запроса - PullRequest
0 голосов
/ 25 сентября 2018

Итак, у меня есть одна коллекция, которую я хотел бы запросить / объединить.Запрос состоит из нескольких частей, которые объединены или.Для каждой части запроса у меня есть определенный набор полей, которые необходимо показать.

Поэтому я надеялся сделать это с помощью агрегата, который будет $ соответствовать запросам ИЛИВсе вместе, а затем используйте $ project с $ cond , чтобы увидеть, какие поля необходимы.Проблема здесь в том, что $ cond использует выражений , в то время как $ match использует запросов .Что является проблемой, поскольку некоторые функции запроса не доступны в качестве выражения.Так что простое преобразование не вариант.

Так что мне нужно другое решение ... - Я мог бы просто создать агрегат для отдельного запроса, потому что там я знаю, какие поля сопоставлять, и они объединяют результаты вместе.Но это не будет работать, если я использую нумерацию страниц в запросах (лимит / пропуск и т. Д.).- найти какой-то другой способ пометить каждый документ, чтобы я мог (впоследствии) удалить любые ненужные поля.Это может быть не очень эффективно, но будет работать.Пока не знаю, как это сделать - придумать способ сделать запросы, которые состоят только из выражений.Для моей цели это может быть достаточно, и это будет означать переписывание анализатора запросов.Это могло бы работать, но не идеально.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

хорошо, теперь я понял это.Я еще не уверен во всех тонкостях этого решения, но, похоже, оно работает в целом.Вот пример:

db.getCollection('somecollection').aggregate(
[
  {
    "$facet": {
      "f1": [

        {
          "$match": {
            <some query 1>
        },
        {
          "$project: {<some fixed field projection>
        }

      ],
        "f2": [
        {
          "$match": {
            <some query 1>
          }
        },
        {
          "$project: {<some fixed field projection>
        }
      ]
    }
  },
  {
        $project: {
              "rt": { $concatArrays: [ "$f1", "$f2"] }
        }

  }, 
  { $unwind: { path: "$rt"} },
  { $replaceRoot: {newRoot:"$rt"}}
]
);
0 голосов
/ 02 октября 2018

Итак, это следующее воплощение прямо здесь.Он будет дедуплицировать и объединять записи и, наконец, снова преобразовывать их во что-то, похожее на обычный результат запроса:

db.getCollection('somecollection').aggregate(
[
  {
    "$facet": {
      "f1": [

        {
          "$match": {
            <some query 1>
        },
        {
          "$project: {<some fixed field projection>}
        }

      ],
        "f2": [
        {
          "$match": {
            <some query 1>
          }
        },
        {
          "$project: {<some fixed field projection>}
        }
      ]
    }
  },
    {
    $project: {
          "rt": { $concatArrays: [ "$f1", "$f2"] }
    }
  }, 
  { $unwind: { path: "$rt"} },
  { $replaceRoot: {newRoot:"$rt"}},
  { $group: {_id: "$_id", items: {$push: {item:"$$ROOT"} } }},
  {
    $project: {
          "rt": { $mergeObjects: "$items" }
    }
  },
  { $replaceRoot: {newRoot:"$rt.item"}},
]
);

Возможно, еще есть некоторая оптимизация, поэтому любые комментарии приветствуются

0 голосов
/ 25 сентября 2018

Я нашел дополнительную опцию, используя $ facet .Таким образом, я могу сделать фасет для каждой группы opf полей / подзапросов.Кажется, это работает нормально, за исключением того, что в результате получается один документ с кучей массивов.пока не уверен, как преобразовать это обратно в несколько документов.

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