使用 nodeJS 和 mongoDB 将字符串推入数据库

Pushing String into database utilizing nodeJS and mongoDB

我是 JS 的新手,我正在利用 MEAN 堆栈创建一个地方,学生可以在其中将 类 添加到他们的用户配置文件中。我的数据库中已经有一个会话存储,因此 "req.user" 将 return 当前登录的用户信息,特别是 "req.user.id" 将 return 当前登录的用户 ID。另外,我已经想出了如何从我的应用程序中搜索我的数据库中的课程。最终,我的目标是当用户发出 post 请求在数据库中搜索时,我还希望将那些 "values" 推入 类 "key"。我提供了两个选项,这两个选项都不会将相应的字符串添加到数据库中。感谢您的帮助!

Search.JS 选项 #1 的一部分

router.post('/', ensureAuthenticated, function (req,res,next) {
    var query = {course: req.body.coursename};
    db.collection('courses').find(query).toArray()
    .then(db.collection('DefaultUser').update({_id: req.user.id}, {$push: {classes: req.body.coursename}}));
    res.render('search', {title: 'search'})
});

Search.JS 选项 #2 的一部分

router.post('/', ensureAuthenticated, function(req,res,next) {
    var query = {course: req.body.coursename};
    db.collection('courses').find(query).toArray((err, results) => {
        if (err) {
            throw err;
        } else {
            db.collection('DefaultUser').updateOne({_id: '5c17161d3347e79410ff29ba'}, {
                                                                $push: {
                                                                    classes: req.body.coursename
                                                                }
                                                            })
            console.log(results)
            res.render('search', {courses: results, title: 'search'})
        }
    })
});

一些提示可能会有所帮助:

    如果您忘记使用 app.use(express.urlencoded()) 来解析发布的数据,
  1. req.body 将一无所获。
  2. 您可以使用 ObjectId('<string>')(在选项 #2 中)来查找和更新查询,而不仅仅是字符串,因为 mongodb 将 _id 存储为 ObjectId 类型默认。
  3. 您可以使用 $addToSet 而不是 $push 修饰符来向数组添加唯一元素,或者您可以让一名学生订阅另外两个相同的 class,如果他重复提交表格。
  4. 在您的代码中,您先在 courses 集合中查找然后更新,但由于您对查找结果未执行任何操作,因此没有必要这样做(空结果不会引发任何错误)。检查数据是否有效是一个很好的做法,如果你想这样做,在这两个选项中,你需要使用 findOne 而不是 find 来确保课程存在,并且 .then(course => {/* check if the course is null and then throws an error */} ).

我没有你项目的完整代码,所以我只能猜测可能存在上面列出的问题,祝你好运!