MongoDB 3.6 - Как изменить этот агрегатный запрос с помощью $ lookup, чтобы его можно было запускать для нескольких документов? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть 2 коллекции, я хочу объединить их, используя оператор $lookup.Поля, к которым я хочу присоединиться, имеют разные типы.Мне не разрешено использовать $toObjectId оператор из-за проблем с обновлением базы данных, а также мне не разрешено изменять существующие данные.

Сбор рецептов

{"_id" : ObjectId("p1"), "currentOrderId" : "o1"}
{"_id" : ObjectId("p2"), "currentOrderId" : "o2"}
{"_id" : ObjectId("p3"), "currentOrderId" : "o3"}
{"_id" : ObjectId("p4"), "currentOrderId" : "o4"} ...

Сбор заказов

{"_id" : ObjectId("o1"), "orderNumber": "123"}
{"_id" : ObjectId("o2"), "orderNumber": "123"}
{"_id" : ObjectId("o3"), "orderNumber": "123"}
{"_id" : ObjectId("o4"), "orderNumber": "123"} ...

Я должен присоединить документы заказа к документам рецепта, чтобы моя коллекция результатов выглядела примерно так:

{"_id" : ObjectId("p1"), 
"currentOrderId" : "o1",
"currentOrder": {
       "_id" : ObjectId("o1"),
       "orderNumber": "123"
 }

...... (еще много документов) .......

Мне удалось присоединиться только к одной паре документов предписания и заказа по следующему запросу:

db.prescription.aggregate([
  { $match: {"_id":ObjectId("p1")}},
  { $addFields: { "coid": ObjectId("o1")}},
  { $lookup: {
    from: "order",
    localField: "coid",
    foreignField: "_id",
    as: "currentOrder"
  }},
  {
    $unwind: "$currentOrder",
  },
])

Примечание. Я жестко закодировал $match и $addfields для проверкимой запросТеперь я хочу применить этот запрос, чтобы иметь возможность объединить все заказы в набор рецептов в пакетном режиме.

Вот что я думаю:

  1. Мы не знаемсколько там рецептов или их _id's, поэтому нам нужно выполнить один запрос, чтобы получить их _ids.И сохраните его в списке.

  2. Мне нужно применить этот запрос в пакетном режиме, чтобы я мог удалить оператор сопоставления.

  3. Мне также нужно получить список заказов _id's, я могу выполнить другой запрос к коллекции рецептов, чтобы получить список строк идентификаторов заказов.

  4. Мне нужно каким-то образом преобразовать список строк из шага 3 в objectID, в пакете.

Извините, это все, что у меня есть сейчас.Я буду рассматривать ответы, связанные с большим количеством запросов, если количество запросов постоянно.Обратите внимание, что я не могу использовать любые операторы, представленные после версии 3.6.

Любая помощь или советы приветствуются.

...