【问题标题】:Mongodb Joining multi document with $lookup aggregation operator and search in the joined document using $or at onceMongodb 使用 $lookup 聚合运算符加入多文档并使用 $or 一次在加入的文档中搜索
【发布时间】:2020-08-07 23:36:33
【问题描述】:

假设我有一个采购订单文档,并且该采购订单文档具有供应商和出口的 ID,它们都是单独的文档(*未嵌入)。

当用户从客户端这样查询时我想要什么“给我采购订单文件,其中(采购订单参考号或供应商名称或商店名称)类似于“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
      }
   }
]

什么是有效的: 如果我从 $or 数组中删除两个其他对象,看起来像这样

[
   {
      "$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
      }
   }
] 

注意:我使用 $and 是因为它可以是来自客户端的更多过滤器,例如采购订单状态等等。

采购订单文件样本

供应商文件样本:

出口文件样本:

我要达到的结果是查询匹配到的采购订单文件。

【问题讨论】:

  • 您能否提供您尝试加入的集合中的示例文档?您能否也提供您希望达到的结果?
  • @LaurenSchaefer 更新了任务,请检查。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

通过用 {} 包装每个 $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
      }
   }
]

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2023-03-05
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多