mongodb-如何过滤查找结果

发布于 2025-02-02 20:56:43 字数 1152 浏览 1 评论 0原文

我是Mongodb的新手。

我的查找给了我以下结果,如何通过下面的结果过滤以获取endivy_delivery_time,使用mongoDB汇总:

[
   {
      "from":"Jeddah",
      "delivery_rule":[
         {
            "to":"Makkah",
            "expected_delivery_time":3
         },
         {
            "to":"Riyadh",
            "expected_delivery_time":2
         }
      ]
   },
   {
      "from":"Riyadh",
      "delivery_rule":[
         {
            "to":"Makkah",
            "expected_delivery_time":3
         },
         {
            "to":"Riyadh",
            "expected_delivery_time":1
         }
      ]
   }
]

以下是我的代码:

{
    $lookup:
    {
        from: "Setting",
        pipeline: [
        {
            $match: {
                $expr: {
                    { $eq: ["$name", "delivery_rules"] }
                }
            }
        ],
        as: "delivery_rules"
    }
},
{ "$match": { "$delivery_rules.value.from": "Jeddah" } },
{ "$match": { "$delivery_rules.value.to": "Riyadh" } },

我需要在MySQL下方的帮助,等于:

SELECT 'expected_delivery_time' WHERE from='Jeddah' AND to='Makkah' 

I'm new to MongoDB.

My lookup gives me the following result, how can I filter through the results below in order to get expected_delivery_time, using MongoDB aggregate:

[
   {
      "from":"Jeddah",
      "delivery_rule":[
         {
            "to":"Makkah",
            "expected_delivery_time":3
         },
         {
            "to":"Riyadh",
            "expected_delivery_time":2
         }
      ]
   },
   {
      "from":"Riyadh",
      "delivery_rule":[
         {
            "to":"Makkah",
            "expected_delivery_time":3
         },
         {
            "to":"Riyadh",
            "expected_delivery_time":1
         }
      ]
   }
]

Below is my code:

{
    $lookup:
    {
        from: "Setting",
        pipeline: [
        {
            $match: {
                $expr: {
                    { $eq: ["$name", "delivery_rules"] }
                }
            }
        ],
        as: "delivery_rules"
    }
},
{ "$match": { "$delivery_rules.value.from": "Jeddah" } },
{ "$match": { "$delivery_rules.value.to": "Riyadh" } },

I need help with below MySQL equivalent to:

SELECT 'expected_delivery_time' WHERE from='Jeddah' AND to='Makkah' 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝天 2025-02-09 20:56:43

基于$查找阶段,我预计结果文档应为:

[
  {
    "from": "Jeddah",
    "delivery_rules": [
      {
        "to": "Makkah",
        "expected_delivery_time": 3
      },
      {
        "to": "Riyadh",
        "expected_delivery_time": 2
      }
    ]
  },
  {
    "from": "Riyadh",
    "delivery_rules": [
      {
        "to": "Makkah",
        "expected_delivery_time": 3
      },
      {
        "to": "Riyadh",
        "expected_delivery_time": 1
      }
    ]
  }
]

delivery_rules(带有“ s”,但是您共享的文档均为delivery_rule_rule

两个delivery_rules.value.value.fromdelivery_rules.value.to不存在。而且,您不应根据查询使用$ 对$ Match阶段中的字段。

  1. $ lookup

  2. $ match - filter 来自和velivery_rules.to。组合2 $ match阶段到1。

  3. $ project - 装饰输出文档。添加endure_delivery_time字段:

    3.1。 $ getfield - get endure_delivery_time从结果 3.1.1。

    3.1.1。 $ first - 从结果 3.1.1.1 array中获取第一个值。

    3.1.1.1。 $ filter - 用to过滤文档是velivery_rules array中的“麦加”。

db.collection.aggregate([
  /* Lookup stage */
  {
    "$match": {
      "from": "Jeddah",
      "delivery_rules.to": "Riyadh"
    }
  },
  {
    $project: {
      expected_delivery_time: {
        "$getField": {
          "field": "expected_delivery_time",
          "input": {
            $first: {
              $filter: {
                input: "$delivery_rules",
                cond: {
                  $eq: [
                    "$this.to",
                    "Makkah"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
])

示例mongo playground

Based on the $lookup stage, I expected the result documents should be:

[
  {
    "from": "Jeddah",
    "delivery_rules": [
      {
        "to": "Makkah",
        "expected_delivery_time": 3
      },
      {
        "to": "Riyadh",
        "expected_delivery_time": 2
      }
    ]
  },
  {
    "from": "Riyadh",
    "delivery_rules": [
      {
        "to": "Makkah",
        "expected_delivery_time": 3
      },
      {
        "to": "Riyadh",
        "expected_delivery_time": 1
      }
    ]
  }
]

delivery_rules (with "s", but the document you shared is with delivery_rule)

Both delivery_rules.value.from and delivery_rules.value.to don't exist. And you shouldn't use $ for the field in $match stage based on your query.

  1. $lookup

  2. $match - Filter from and delivery_rules.to. Combine 2 $match stages into 1.

  3. $project - Decorate output document. Add expected_delivery_time field:

    3.1. $getField - Get expected_delivery_time field from the result 3.1.1.

    3.1.1. $first - Get the first value from the result 3.1.1.1 array.

    3.1.1.1. $filter - Filter the document with to is "Makkah" in delivery_rules array.

db.collection.aggregate([
  /* Lookup stage */
  {
    "$match": {
      "from": "Jeddah",
      "delivery_rules.to": "Riyadh"
    }
  },
  {
    $project: {
      expected_delivery_time: {
        "$getField": {
          "field": "expected_delivery_time",
          "input": {
            $first: {
              $filter: {
                input: "$delivery_rules",
                cond: {
                  $eq: [
                    "$this.to",
                    "Makkah"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
])

Sample Mongo Playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文