Mongodb Объединение нескольких документов с помощью оператора агрегирования $ lookup и поиск в объединенном документе с помощью $ или сразу - PullRequest
0 голосов
/ 07 августа 2020

Допустим, у меня есть документ заказа на закупку, и этот документ заказа на поставку имеет идентификаторы поставщика и торговой точки, которые оба являются разделенными документами (* не встроены).

Что я хочу, когда пользователь запрашивает подобное со стороны клиента "предоставьте мне документы заказа на закупку, которые (ссылочный номер заказа на покупку или название поставщика или название торговой точки) похожи на" Otilia "

На данный момент я сделал агрегированный запрос:

[
   {
      "$lookup":{
         "from":"outlets",
         "localField":"outlet",
         "foreignField":"_id",
         "as":"outlets"
      }
   },
   {
      "$lookup":{
         "from":"suppliers",
         "localField":"supplier",
         "foreignField":"_id",
         "as":"suppliers"
      }
   },
   {
      "$match":{
         "$and":[
            {
               "$or":[
                  {
                     "outlets.name":{
                        "$regex":".*Otilia.*",
                        "$options":"i"
                     },
                     "referenceNumber":{
                        "$regex":".*Otilia.*",
                        "$options":"i"
                     },
                     "suppliers.name":{
                        "$regex":".*Otilia.*",
                        "$options":"i"
                     }
                  }
               ]
            }
         ]
      }
   },
   {
      "$sort":{
         "outlets.name":1,
         "_id":1
      }
   }
]

Что работает: если я удалю буксировку других объектов из $ или массива, который выглядит следующим образом

[
   {
      "$lookup":{
         "from":"outlets",
         "localField":"outlet",
         "foreignField":"_id",
         "as":"outlets"
      }
   },
   {
      "$lookup":{
         "from":"suppliers",
         "localField":"supplier",
         "foreignField":"_id",
         "as":"suppliers"
      }
   },
   {
      "$match":{
         "$and":[
            {
               "$or":[
                  {
                     "suppliers.name":{
                        "$regex":".*Otilia.*",
                        "$options":"i"
                     }
                  }
               ]
            }
         ]
      }
   },
   {
      "$sort":{
         "outlets.name":1,
         "_id":1
      }
   }
] 

Примечание: я использовал $ и потому что это могло быть больше фильтров со стороны клиента например, статус заказа на поставку и др.

Образец документа заказа на поставку

enter image description here

Supplier document Sample:

enter image description here

outlet document Sample:

введите описание изображения здесь

Результат, которого я хочу добиться, - это сопоставление документов заказов на покупку по запросу.

1 Ответ

0 голосов
/ 07 августа 2020

Решено заключением каждого выражения $ or в скобки.

Я просто забыл заключить каждое выражение $ or в квадратные скобки.

правильный формат запроса:

[
   {
      "$lookup":{
         "from":"outlets",
         "localField":"outlet",
         "foreignField":"_id",
         "as":"outlets"
      }
   },
   {
      "$lookup":{
         "from":"suppliers",
         "localField":"supplier",
         "foreignField":"_id",
         "as":"suppliers"
      }
   },
   {
      "$match":{
         "$and":[
            {
               "$or":[
                  {
                     "orderNumber":{
                        "$regex":".*Celia Pouros.*",
                        "$options":"i"
                     }
                  },
                  {
                     "supplierInvoice":{
                        "$regex":".*Celia Pouros.*",
                        "$options":"i"
                     }
                  },
                  {
                     "suppliers.name":{
                        "$regex":".*Celia Pouros.*",
                        "$options":"i"
                     }
                  }
               ]
            }
         ]
      }
   },
   {
      "$sort":{
         "outlets.name":1,
         "_id":1
      }
   }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...