【问题标题】:How to access dynamic mongoDB collections using express route parameters如何使用快速路由参数访问动态 mongoDB 集合
【发布时间】:2021-07-22 07:11:36
【问题描述】:

我的 MongoDB 数据库已动态创建集合。我想使用格式如下的快速路由访问特定集合:rootUrl/projects/[projectId]/stages/

我尝试过的(不起作用): 动态创建模式模型的函数:

function dynamicStageModel(projectId) {
  stageSchema = new mongoose.Schema({ ... });
  return mongoose.model(projectId, stageSchema, projectId);
}

并在快速路由中调用该函数:

router.get("/:projectId/stages", (req, res) => {
  const Stage = dynamicStageModel(req.params.projectId);
  Stage.find({}, (err, result) => {
    console.log("result: " + result);
  })
    .then((result) => {
      res.status(200).send(result);
    })
    .catch((err) => {
      res.status(500).send(err);
    });
});

这仅适用于特定集合的第一个查询,但同一集合(相同 projectId)的后续查询会引发错误,因为我的模型函数正在使用相同的参数调用 mongoose.Model。错误:OverwriteModelError: Cannot overwrite `project3` model once compiled. 我考虑过遍历所有集合并为每个集合创建路由,但是如果有数千个集合,这会变得非常庞大。

【问题讨论】:

    标签: mongodb express mongoose


    【解决方案1】:

    不是一个完美的解决方案,但我最终使用路由参数回调函数来维护模型列表并在不存在的情况下创建一个新模型:

    const models = {};
    
    router.param("projectId", (req, res, next, projectId) => {
      if (!models[projectId]) {
        console.log(`Creating model ${projectId}`);
        models[projectId] = dynamicStageModel(projectId);
      }
      next();
    });
    
    router.get("/:projectId/stages", (req, res) => {
      console.log("GET project Id: " + req.params.projectId);
    
      models[req.params.projectId]
        .find({}, (err, result) => {
          console.log("result: " + result);
        })
        .then((result) => {
          res.status(200).send(result);
        })
        .catch((err) => {
          res.status(500).send(err);
        });
    });
    

    这只是为每个集合提供模式模型的最低限度,但缺点是会稍微增加响应时间并有效地创建第二个事实来源(不由数据库本身维护的集合名称列表)。

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 2016-04-14
      • 2021-09-17
      • 1970-01-01
      • 2016-06-06
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多