在Node.js中优化组合MongoDB查询

达克沙(Daksh Shah)

我已经存储了十站stations集合:Station AStation BStation CStation DStation EStation FStation GStation HStation IStation J

现在,要创建所有可能的站点对之间的所有站点间行驶的计数列表,我在Node.js代码中执行以下操作(使用Mongoose):

const stationCombinations = []

// get all stations from the stations collection
const stationIds = await Station.find({}, '_id name').lean().exec()

// list of all possible from & to combinations with their names
stationIds.forEach(fromStation => {
  stationIds.forEach(toStation => {
    stationCombinations.push({ fromStation, toStation })
  })
})

const results = []

// loop through all station combinations
for (const stationCombination of stationCombinations) {
  // create aggregation query promise
  const data = Ride.aggregate([
    {
      $match: {
        test: false,
        state: 'completed',
        duration: { $gt: 2 },
        fromStation: mongoose.Types.ObjectId(stationCombination.fromStation._id),
        toStation: mongoose.Types.ObjectId(stationCombination.toStation._id)
       }
    },
    {
      $group: {
        _id: null,
        count: { $sum: 1 }
      }
    },
    {
      $addFields: {
        fromStation: stationCombination.fromStation.name,
        toStation: stationCombination.toStation.name
      }
    }
  ])

  // push promise to array
  results.push(data)
}

// run all aggregation queries
const stationData = await Promise.all(results)

// flatten nested/empty arrays and return
return stationData.flat()

执行此功能可以得到以下格式的结果:

[
  {
    "fromStation": "Station A",
    "toStation": "Station A",
    "count": 1196
  },
  {
    "fromStation": "Station A",
    "toStation": "Station B",
    "count": 1
  },
  {
    "fromStation": "Station A",
    "toStation": "Station C",
    "count": 173
  },
]

And so on for all other combinations...

该查询当前需要花费很多时间来执行,并且由于这些查询,我不断从MongoDB Atlas收到有关数据库服务器上负载过大的警报。当然必须有一种优化的方法来做这样的事情吗?

瓦利洪

您需要使用MongoDB本机操作。您需要$groupfromStationtoStation$lookup加入两个集合。

注意:我假设您的MongoDB> = v3.6,Station._id并且ObjectId

db.ride.aggregate([
  {
    $match: {
      test: false,
      state: "completed",
      duration: {
        $gt: 2
      }
    }
  },
  {
    $group: {
      _id: {
        fromStation: "$fromStation",
        toStation: "$toStation"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $lookup: {
      from: "station",
      let: {
        fromStation: "$_id.fromStation",
        toStation: "$_id.toStation"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$_id",
                [
                  "$$fromStation",
                  "$$toStation"
                ]
              ]
            }
          }
        }
      ],
      as: "tmp"
    }
  },
  {
    $project: {
      _id: 0,
      fromStation: {
        $reduce: {
          input: "$tmp",
          initialValue: "",
          in: {
            $cond: [
              {
                $eq: [
                  "$_id.fromStation",
                  "$$this._id"
                ]
              },
              "$$this.name",
              "$$value"
            ]
          }
        }
      },
      toStation: {
        $reduce: {
          input: "$tmp",
          initialValue: "",
          in: {
            $cond: [
              {
                $eq: [
                  "$_id.toStation",
                  "$$this._id"
                ]
              },
              "$$this.name",
              "$$value"
            ]
          }
        }
      },
      count: 1
    }
  },
  {
    $sort: {
      fromStation: 1,
      toStation: 1
    }
  }
])

蒙哥运动场

未经测试:

const data = Ride.aggregate([
  {
     $match: {
       test: false,
       state: 'completed',
       duration: { $gt: 2 }
     }
  },
  {
    $group: {
      _id: {
        fromStation: "$fromStation",
        toStation: "$toStation"
      },
      count: { $sum: 1 }
    }
  },
  {
    $lookup: {
      from: "station",
      let: {
        fromStation: "$_id.fromStation",
        toStation: "$_id.toStation"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$_id",
                [
                  "$$fromStation",
                  "$$toStation"
                ]
              ]
            }
          }
        }
      ],
      as: "tmp"
    }
  },
  {
    $project: {
      _id: 0,
      fromStation: {
        $reduce: {
          input: "$tmp",
          initialValue: "",
          in: {
            $cond: [
              {
                $eq: [
                  "$_id.fromStation",
                  "$$this._id"
                ]
              },
              "$$this.name",
              "$$value"
            ]
          }
        }
      },
      toStation: {
        $reduce: {
          input: "$tmp",
          initialValue: "",
          in: {
            $cond: [
              {
                $eq: [
                  "$_id.toStation",
                  "$$this._id"
                ]
              },
              "$$this.name",
              "$$value"
            ]
          }
        }
      },
      count: 1
    }
  },
  {
    $sort: {
      fromStation: 1,
      toStation: 1
    }
  }
])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Node JS在MongoDb中聚合查询

来自分类Dev

MongoDB聚合查询,其中node.js中的位置

来自分类Dev

mongodb(+ mongoose)+ node.js中的同步查询

来自分类Dev

MongoDB聚合查询,其中node.js中的位置

来自分类Dev

查询子文档MongoDB Node.JS

来自分类Dev

Node js Mongodb查询号长

来自分类Dev

使用Node JS和MongoDB过滤查询

来自分类Dev

Node js Mongodb查询号长

来自分类Dev

Node.js,mongodb和过滤查询

来自分类Dev

Node.JS Mongodb 查询/创建

来自分类Dev

是否有“ span”和“ foldl”的优化组合,还是GHC会优化组合?

来自分类Dev

查询Node中MongoDb Mongoose的返回集合

来自分类Dev

如何在node.js中构造特定查询以从mongodb中获取数据?

来自分类Dev

使用MySQL在Node JS中嵌套查询

来自分类Dev

Node.js中的“ where in” MySQL查询

来自分类Dev

Node.js中的并行SQLite查询

来自分类Dev

同步node.js中的查询(或事件)

来自分类Dev

在Node.js中插入查询

来自分类Dev

如何使用Node.js中的变量创建mongodb查询对象

来自分类Dev

MongoDB查询在Node.js中不起作用 为什么此代码不起作用?

来自分类Dev

如何在mongodb的node.js实现中执行不区分大小写的查询?

来自分类Dev

在查询中具有文档的_id字段值的nodejs + mongodb访问node.js对象

来自分类Dev

如何通过node.js中req.params.id的值来区分mongoDB查询?

来自分类Dev

mongodb shell和node.js中的相同查询的行为不同

来自分类Dev

如何解析node.js和mongodb查询中的对象数组?

来自分类Dev

查询mongodb并将结果传递给node.js中的http服务器

来自分类Dev

将查询条件传递到生成查询字符串的Node.js / Mongodb中的db.collection.find

来自分类Dev

如何使用Node JS将mongoDB查询记录到终端

来自分类Dev

使用node.js查询mongoDB的特定字段

Related 相关文章

  1. 1

    使用Node JS在MongoDb中聚合查询

  2. 2

    MongoDB聚合查询,其中node.js中的位置

  3. 3

    mongodb(+ mongoose)+ node.js中的同步查询

  4. 4

    MongoDB聚合查询,其中node.js中的位置

  5. 5

    查询子文档MongoDB Node.JS

  6. 6

    Node js Mongodb查询号长

  7. 7

    使用Node JS和MongoDB过滤查询

  8. 8

    Node js Mongodb查询号长

  9. 9

    Node.js,mongodb和过滤查询

  10. 10

    Node.JS Mongodb 查询/创建

  11. 11

    是否有“ span”和“ foldl”的优化组合,还是GHC会优化组合?

  12. 12

    查询Node中MongoDb Mongoose的返回集合

  13. 13

    如何在node.js中构造特定查询以从mongodb中获取数据?

  14. 14

    使用MySQL在Node JS中嵌套查询

  15. 15

    Node.js中的“ where in” MySQL查询

  16. 16

    Node.js中的并行SQLite查询

  17. 17

    同步node.js中的查询(或事件)

  18. 18

    在Node.js中插入查询

  19. 19

    如何使用Node.js中的变量创建mongodb查询对象

  20. 20

    MongoDB查询在Node.js中不起作用 为什么此代码不起作用?

  21. 21

    如何在mongodb的node.js实现中执行不区分大小写的查询?

  22. 22

    在查询中具有文档的_id字段值的nodejs + mongodb访问node.js对象

  23. 23

    如何通过node.js中req.params.id的值来区分mongoDB查询?

  24. 24

    mongodb shell和node.js中的相同查询的行为不同

  25. 25

    如何解析node.js和mongodb查询中的对象数组?

  26. 26

    查询mongodb并将结果传递给node.js中的http服务器

  27. 27

    将查询条件传递到生成查询字符串的Node.js / Mongodb中的db.collection.find

  28. 28

    如何使用Node JS将mongoDB查询记录到终端

  29. 29

    使用node.js查询mongoDB的特定字段

热门标签

归档