使用MongoDB Atlas中的UI编辑文档后,Mongoose.save()和.findOneAndUpdate()出现问题

使用MongoDB Atlas中的UI编辑文档后,Mongoose.save()和.findOneAndUpdate()出现问题,mongodb,mongoose,mongodb-atlas,Mongodb,Mongoose,Mongodb Atlas,我是编程新手,有一个使用Express、Mongoose和MongoDB(托管在Atlas上)的基本RESTAPI。我有一个用户模式和一个博客模式,如下所示: const userSchema = mongoose.Schema({ username: { type: String, minlength: 3, unique: true }, passwordHash: String, name: String, blogs: [{ type: m

我是编程新手,有一个使用Express、Mongoose和MongoDB(托管在Atlas上)的基本RESTAPI。我有一个用户模式和一个博客模式,如下所示:

const userSchema = mongoose.Schema({
    username: { type: String, minlength: 3, unique: true },
    passwordHash: String,
    name: String,
    blogs: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Blog'
    }]
})

const blogSchema = mongoose.Schema({
    title: String,
    author: String,
    user: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
    },
    url: String,
    likes: { type: Number, default: 0 }
})
这是我的post请求代码,在这里我看到了奇怪的行为。这是一个post请求,要求1)保存一个新博客,然后2)更新用户文档,将该博客的id包含在用户文档的数组中。从DB的角度来看,我理解这可能不是最好的做法,但我们还是把它看作是一个实验。
const blogsRouter = require('express').Router()
const jwt = require('jsonwebtoken')
const Blog = require('../models/blog')
const User = require('../models/user')

...

blogsRouter.post('/', async (request, response, next) => {
    try {
        if (request.body.title === undefined || request.body.url === undefined) {
            response.status(400).end()
        }

        const decodedToken = jwt.verify(request.token, process.env.SECRET)
        if (!request.token || !decodedToken.id) {
            return response.status(401).send({ error: 'Missing or invalid token' }) 
        }
        const user = await User.findById(decodedToken.id)

        const blog = new Blog({ 
            title: request.body.title,
            author: request.body.author,
            user: user,
            url: request.body.url,
            likes: request.body.likes
        })

        const savedBlog = await blog.save()
        if (savedBlog) {
            user.blogs = user.blogs.concat(savedBlog._id)
            // .markModified() as shown here doesn't seem to make a difference
            // user.markModified('blogs')
            await user.save()
            // Different behaviour if I use .findOneAndUpdate()
            // await User.findOneAndUpdate({ _id: user.id }, { $set: user }, { new: true })
            response.status(201).json(savedBlog)
        } else {
            response.status(400).end()
        }

    } catch (exception) {
        next(exception)
    }

})

一切正常,直到我注意到,如果我打开MongoDB Atlas UI并手动编辑用户的任何文档属性(使用铅笔图标),我将无法在该特定的用户文档上保存()或.findOneAndUpdate()。我仍然可以保存和编辑的其他用户文档。如果我创建了一个新的用户文档,它将按预期工作

具体来说,程序不会抛出错误,但根据使用的是.save()还是.findOneAndUpdate(),我会得到稍微不同的行为。对于.save(),邮递员无限期地等待响应-它似乎停留在
wait user.save()
这一行。对于.findOneAndUpdate(),Postman会收到响应,但不会更新用户文档的
blogs
属性

起初,我认为只有编辑
blogs
属性时才会出现问题。所以我找到了一些建议和建议。但事实证明,如果我编辑用户的任何属性,就可以重新创建问题


我知道我可能不应该在Atlas UI中编辑文档,但我很好奇为什么会出现这个问题,以及是否有办法解决它

我猜你有一个预存钩子用于你的用户模式,如果可能的话请包括它。我猜你有一个预存钩子用于你的用户模式,如果可能的话请包括它。