【问题标题】:mongoose how to find all data from object?猫鼬如何从对象中查找所有数据?
【发布时间】:2019-07-06 23:35:48
【问题描述】:

只是我想查找具有相同对象 ID 但不工作的所有数据

   app.get("/admin/phase/:level", function(req,res){

            Level.findOne({_id: req.params.level},function(err,onelevel){
            console.log(onelevel._id)
            Semster.find({level: onelevel._id},function(err,semster){

                    Module.find({semster: semster._id } , function(err , modules){
                    console.log(semster)
                        res.render("semster",{onelevels: onelevel, semsters: semster, modules: modules})})})})});

【问题讨论】:

  • 你遇到了什么错误?
  • 当我写 console.log (semester._id) 时,错误是“未定义”,因为学期是对象
  • 使用semester[0]._id
  • 是的,它可以工作,但如果我不知道有多少文件......例如学期。[N]._id
  • @Colin,是的....

标签: database mongodb express mongoose nosql


【解决方案1】:

我建议在您的数据库查询中使用async and await,这样猫鼬就有足够的时间来查找文档。话虽如此,我将使用 try-catch 块来响应查询中的错误。

app.get("/admin/phase/:level",async function(req,res){
  try{
    const onelevel = await Level.findOne({_id: req.params.level});
    const semster = await Semster.find({level: onelevel._id});
    let modules = [];
    for(let i = 0; i < semster.length; i++){
      let module = await Module.find({semster: semster[i]._id });
      modules.push(...module)
    };

        res.render("semster",{
            onelevels: onelevel,
            semsters: semster,
            modules: modules})
        })
      })
    })
  catch(err){
    res.status(500).render("/uhOhPage",{
        message: err.message
    })
 });

【讨论】:

  • 它不起作用,因为对象 semster._id 的问题如果我写 semster[0]._id 或 semster 它可以工作,因为 semster 是对象,我想找到所有文档 semster 和所有 ref 模块
  • 我重做了它,以便它捕获所有模块,但数组中应该只有一个学期。如果你在上面的调用中使用 find 并且通过它的唯一 ID。
【解决方案2】:

我们通过使用MongoDB Aggregate 或使用带有async/await 的循环来解决这个问题。我希望您更喜欢使用 MongoDB 作为执行此操作的首选和最佳方法。

使用 JavaScript:

app.get("/admin/phase/:level", async function (req, res) {

    Level.findOne({ _id: req.params.level }, function (err, onelevel) {
        Semster.find({ level: onelevel._id }, function (err, semsters) {
            const modulePromise = semsters.map(semster => Module.find({ semster: semster._id }));
            var modules = await Promise.all(modulePromise);
            res.render("semster", { onelevels: onelevel, semsters: semsters, modules: modules })
        })
    })
});

更新:

app.get("/admin/phase/:level", async function (req, res) {
    try {
        const onelevel = await Level.findOne({ _id: req.params.level });
        const semsters = await Semster.find({ level: onelevel._id });
        const modulePromise = semsters.map(semster => Module.find({ semster: semster._id }));
        var modules = await Promise.all(modulePromise);
        res.render("semster", { onelevels: onelevel, semsters: semsters, modules: modules })
    } catch (err) {
        //Your Error Handler
    }
});

使用 Mongo 聚合:

app.get("/admin/phase/:level", function (req, res) {
    Level.findOne({ _id: req.params.level }, function (err, onelevel) {
        Semster.aggregate([
            { $match: { level: onelevel._id } },
            { $lookup: { from: "module", localField: "_id", foreignField: "semster", as: "module" } }
        ], function (err, semsters) {
            res.render("semster", { onelevels: onelevel, semsters: semsters})
        })
    })
});

【讨论】:

  • 第一个错误是 SyntaxError: await 仅在异步函数中有效我删除 await 并且我得到其他错误 ReferenceError: promises is not defined 当我删除 await Promise.all(promises);我运行 node app 它可以工作,但我认为该模块为 null 。当我使用 console.log(modules)
  • 我明白了 [查询 { _mongooseOptions: {}, _transforms: [], _hooks: Kareem { _pres: Map {}, _posts: Map {} }, _executionCount: 0, mongooseCollection: NativeCollection { collection : [Object], opts: [Object], name: 'modules', collectionName: 'modules', conn: [Object],
  • 我在功能路由器检查和添加时添加了async
  • 使用await Promise.all(modules);
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2023-01-22
  • 2022-09-27
  • 2021-10-15
  • 2023-01-30
相关资源
最近更新 更多