【问题标题】:Search on overridden fields in different collections in mongodb在 mongodb 的不同集合中搜索覆盖的字段
【发布时间】:2020-04-27 10:47:32
【问题描述】:

我有两个集合,全局和本地。 Global 包含全局数据,local 包含覆盖数据。

全局文档如下所示:

{
    "sku" : "MAYBE0000001",

    "color" : "BLUE",
    "gender" : "F",
    "variant" : null,
    "price" : "1000"
})

本地文档的样子

{
    "sku" : "MAYBE0000001",
    "price" : "1500"
}

我要搜索:

  1. 对于 1300 到 1800 的价格范围,搜索应该给我 MAYBE0000001 产品,因为它已被覆盖。
  2. 对于从 700 到 1300 的价格范围,搜索应该给我 0 个结果。
  3. 对于性别“F”的搜索,我应该得到 sku MAYBE0000001,因为它没有被覆盖。

合并价格后如何运行查询。将来可能会覆盖颜色。

【问题讨论】:

    标签: mongodb collections


    【解决方案1】:

    你可以在$lookup的帮助下完成

    1. 对于 1300 到 1800 的价格范围,搜索应该给我 MAYBE0000001 产品,因为它已被覆盖。
    2. 对于价格范围从 700 到 1300 的搜索应该给我 0 个结果。

    我在本地集合中启动了查询。并写了一个范围查询。

    1. 或搜索性别“F”,我应该得到 sku MAYBE0000001,因为它没有被覆盖。

    为此,我在查找后应用了$match

    我在这里写下相同的查询:

    db.local.aggregate([
      {
        $match:{
          "price":{
            $gt:"1300",
            $lte:"1800"
          }
        }
      },
      {
        $lookup:{
          from:"global",
          let:{
            "sku":"$sku"
          },
          pipeline:[
            {
              $match:{
                $expr:{
                  $eq:[
                    "$sku",
                    "$$sku"
                  ]
                }
              }
            }
          ],
          as:"lookups"
        }
      },
      {
        $unwind:"$lookups"
      },
      {
        $project:{
          "sku":1,
          "price":1,
          "gender":"$lookups.gender",
          "color":"$lookups.color",
          "variant":"$lookups.variant"
        }
      },
      {
        $match:{
          "gender":"F"
        }
      }
    ]).pretty()
    

    输出

    {
            "_id" : ObjectId("5ea6f19ac3798d09bdd1c516"),
            "sku" : "MAYBE0000001",
            "price" : "1500",
            "gender" : "F",
            "color" : "BLUE",
            "variant" : null
    }
    

    有关$lookup的更多信息,请参阅here

    希望这会有所帮助:)

    【讨论】:

    • 谢谢。它回答了这个问题。非常感谢您的回答。
    • 我很高兴它有帮助:)
    • 嗨 Vijay,你能告诉我如何在全局上添加 local 的存在案例吗://5. if we want to search on global $match:{ "local.gender":{"exists":false}, "gender":"F" } }
    • 能否详细说明用例?
    • 那么你必须开始聚合全局集合并查找本地集合。然后不要在 price 上应用匹配,而应将其应用到 gender
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 2017-06-26
    • 1970-01-01
    • 2021-07-06
    • 2015-06-04
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多