在带有猫鼬的 mongodb 中加载和保存文档

Load and save document in mongodb with mongoose

本文关键字:加载 保存 文档 mongodb      更新时间:2023-09-26

我有以 express 作为服务器端框架运行的节点。

我创建了以下端点:

app.post('/post/save', auth.auth, function (req, res) {
Post.findById(req.body._id, function (err, post) {
  post = post || new Post();
  post.author.name = req.user.getName();
  post.author.id = req.user._id;
  post.title = req.body.title;
  post.body = req.body.body;
  post.save(function (err, object) {
    err && res.send(500);
    res.status(200).send({ /*id: object._id*/ });
  });  
});
});

当我第一次称之为时,它有效。当我第二次调用它时,它失败了。请求只是保持挂起状态,并且从保存函数调用返回的对象是未定义的。

两个请求中都undefined req.body._id。我尝试连续创建 2 个新帖子。

我想做的是检查文档是否存在,如果存在,请更新它,然后保存它,或创建一个新文档。

我知道像 upsert 这样的东西存在,但我不能使用它,因为我需要预保存中间件来触发,而且它只在.save之前触发。

任何人都可以看到错误吗?

如果你把你的逻辑放在一个回调上,然后 - 根据请求查询值创建或查找一个Post,传递你的回调函数怎么办?只是不要忘记删除此作业:post.author.id = req.user._id;

app.post('/post/save', auth.auth, function (req, res) {
    var callback = function(post) {
      post.author.name = req.user.getName();
      post.title = req.body.title;
      post.body = req.body.body;
      post.save(function (err, object) {
        err && res.send(500);
        res.status(200).send({ /*id: object._id*/ });
      });  
    };
    if (req.body._id) {
        Post.findById(req.body._id, function (err, post) {
            callback(post);
        });        
    } else {
        var post = new Post();
        callback(post);
    }
});

一旦我从模型中删除了unique字段,并将集合放在数据库中,我的原始帖子就起作用了。

删除索引可能就足够了; 见列昂尼德·贝沙斯特尼斯的评论;

当您将字段设置为唯一时,猫鼬会创建一个唯一的字段 此字段上的索引。即使在删除后,此索引仍保留在MongoDB中 独一无二:真正的旗帜。删除集合索引应该可以解决 问题