【问题标题】:How to look up into db in mongo db using node js如何使用节点 js 在 mongodb 中查找 db
【发布时间】:2021-12-17 20:45:53
【问题描述】:

我正在学习 NodeJS 和 Mongo Db,但我陷入了困境。如果您知道解决方案,您能帮帮我吗?

我有 2 个问题

1.)我在 mongo db 中有 2 个集合 我试图找出用户有哪些项目。例如 michaela 有项目 :nodejs, test2 jasmin 有项目:test2(我不想知道谁是当前项目的编码人员,但我想知道当前用户的项目是什么)

我想要得到的数据应该是这样的

[{
  id: "some value"
  username: "michaela"
  email:"some value"
  password:"some value"
  projects:"[{
     project_name:"node js"
     project_description:"learn node js"
     deadline:"2021-11-12"
     status:"todo" 
  },
  {
     project_name:"test2"
     project_description:"learn node js"
     deadline:"2021-11-12"
     status:"todo" 
  }]
  },
  id: "some value"
  username: jasmin"
  email:"some value"
  password:"some value"
  projects:"[
  {
     project_name:"test2"
     project_description:"learn node js"
     deadline:"2021-11-12"
     status:"todo" 
  }]

}]

我不完全了解查找的工作原理。我尝试了以下示例(测试),但它不起作用

我也不明白如何连接 2 个数据库,例如 allMembers 和我合并到一个数组中的所有项目,但我认为这不是正确的方法。

这是我的模特

const usersCollection = require('../db').db().collection("users")
const projectsCollection = require('../db').db().collection("projects")

Team.prototype.getAllMembers = function(){
    return new Promise (async (resolve, reject) => {
        try{
            let allMembers = await usersCollection.find({}).toArray()
            let allprojects = await projectsCollection.find({}).toArray()
                        let test = await  usersCollection.aggregate([
                {$lookup: {from: "projects", localField: "username", foreignField: "coder", as: "projects"}},
                {$project: {
                    username:1, 
                    projects:{
                         name:{$arrayElemAt: ["$projects.project_name", 0]},
                         description:{$arrayElemAt: ["$projects.project_description", 0]},
                    },
                    email:1,
                    password:1,
                  }}
              ]).toArray()
              console.log("test", test)
            let arr3 = [...allMembers, ...allprojects]
            resolve(arr3)
        }catch{
            reject()
        }
    })
}


这是我的控制器

exports.home = function(req, res) {
    //when user is log in
    if (req.session.user) {
     let teamMember = new Team(req.body)
      teamMember.getAllMembers().then((data)=>{
        console.log("members data", data)
          if(data){
            res.render('members', {data: data })
          }else{
            res.send("on this page are no data")
          }
      }).catch((err)=>{
          res.send("problem")
      }) 
      //when user is not log in, flash tie errory z db automaticky vymaze po pouziti
    } else {
      res.render('login', {errors: req.flash('errors'), regErrors: req.flash('regErrors')})
    }
  }


这就是它在 db 中的样子

提前谢谢你

【问题讨论】:

    标签: node.js database mongodb lookup


    【解决方案1】:

    我认为您应该像这样匹配用户名那样聚合用户集合,然后投影项目的第一个元素 在这里查找将项目放入项目字段

    db.users.aggregate([
      {
        $match: {
          username: "jasmin"
        }
      },
      {
        "$lookup": {
          "from": "projects",
          "localField": "username",
          "foreignField": "coder",
          "as": "projects"
        }
      },
      {
        "$project": {
          username: 1,
          email:1,
          password:1,
          projects: 1
        }
      }
    ])
    

    https://mongoplayground.net/p/U6hNw2WdQLE

    如果您想使用该项目中的第一个项目获取所有数据

    db.users.aggregate([
    
      {
        "$lookup": {
          "from": "projects",
          "localField": "username",
          "foreignField": "coder",
          "as": "projects"
        }
      },
      {
        "$project": {
          username: 1,
          email:1,
          password:1,
          projects:{$arrayElemAt: ["$projects", 0]}
        }
      }
    ])
    

    【讨论】:

    • 评论不适用于扩展讨论或调试会话;这个对话是moved to chat。请务必将edit所有重要信息放入答案本身!
    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多