我是mongodb的新手.

我的查找得到以下结果,如何使用mongodb aggregate筛选以下结果以获得预期的\u delivery\u时间:

[
   {
      "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'

推荐答案

基于$lookup阶段,我预计结果文件应为:

[
  {
    "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)

delivery_rules.value.fromdelivery_rules.value.to都不存在.根据您的查询,您不应该在$match阶段的字段中使用$.

  1. $lookup

  2. $match-过滤器fromdelivery_rules.to.将2个$match级合并为1个.

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

    3.1. $getField-从结果3.1.1.中获取expected_delivery_time字段

    3.1.1. $first-从结果3.1.1.1数组中获取第一个值.

    3.1.1.1. $filter-使用delivery_rules数组中的to为"麦加"过滤文档.

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

Mongodb相关问答推荐

MongoDB聚合匹配字符串字符

Go mongo-驱动程序测试,FindOne未根据给定的筛选器返回正确结果

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

没有文档的MongoDB集合中的不一致,但当我执行count()时,它告诉我有15个文档

如何在MongoSH中的现有文档中插入字段

MongoDB:检测所有重叠事件(开始/结束日期)?

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

从MongoDB迁移到PostgreSQL:为PostgreSQL编写聚合管道查询

使用Go的Mongo驱动程序,从MongoDB文档中获取元素并更新其值需要帮助

如何修改 mongodb 中嵌套对象数组中的字段名称/键?

将子文档中的所有字段设置为 false,然后在单个查询中将第二个字段设置为 true

当属性确实存在时,为什么mongoose模型的 hasOwnProperty 返回 false?

Node.js 和 Passport 对象没有方法 validPassword

MongoDB:单个数据库处理程序的 >5 个打开连接

mongodb nodejs - 转换圆形 struct

MongoError:Topology is closed, please connect despite established database connection

Mongodb 类型引用 node

Java + MongoDB:更新文档中的多个字段

MongoDB Compass 中 JSON 输入意外结束

在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么