Javascript MongooseJS:`TypeError:Object#<;对象>;没有方法';保存';`:无法保存文档的一部分?

Javascript MongooseJS:`TypeError:Object#<;对象>;没有方法';保存';`:无法保存文档的一部分?,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我正在研究如何检索数组元素的堆栈溢出,通过查看以下链接,我发现了这一点: 仅检索MongoDB集合中对象数组中的查询元素 以下是我根据以下问题创建的查询: exports.confirmFriend = function(req, res){ if(req.body._id) {delete req.body._id} User.findOne({'username': req.params.username}, {'friends': {$elemMatch: {'username

我正在研究如何检索数组元素的堆栈溢出,通过查看以下链接,我发现了这一点:

仅检索MongoDB集合中对象数组中的查询元素

以下是我根据以下问题创建的查询:

exports.confirmFriend = function(req, res){
  if(req.body._id) {delete req.body._id}
    User.findOne({'username': req.params.username}, {'friends': {$elemMatch: {'username': req.body.username}}}, function (err, user){
      if(err) { return handleError(res, err); }
      if(!user) { return res.send(404); }
      //This is because $elemMatch returns only the first element so only 1 element will be populated
      user.friends[0] = req.body;
      user.save();
      //Here I want to UPDATE or SAVE the document that I queried for now
    });

现在,我已经查询了user.friends元素,并为其正确分配了req.body和正确的内容,我想知道,是否有方法更新或保存我执行此分配/查询的文档?当我在作业结束时调用
user.save()
时,我得到一个错误,它说:
TypeError:Object#没有方法“save”
。有没有办法解决这个问题?谢谢

是的,所以这不再是猫鼬文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组

这意味着即使这是一个mongoose文档,
.save()
也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容

因此,您的方法可以归结为:

  • 不要使用投影并在代码中标识数组元素,请使用
    .save()

  • 只需对此进行原子更新即可修改文档。无论如何,可能更安全,因为您无法保证在阅读文档后其他内容没有修改文档,但当然会删除所有mongoose验证和挂钩:

    User.findOneAndUpdate(
        {
            "username": req.params.username,
            "friends.username": req.body.username
        },
        {
            "$set": { "friends.$": req.body }
        },
        function(err,user) {
    
           // do something with the now modified user
    
        }
    );
    
  • 因此,请注意,在某些情况下,不可能在响应中返回完整的文档对象,否则需要手动强制转换为完整的文档对象,但它可能与源对象不同


    第二种形式基本上是为了确保在两个操作之间不发布任何更改。即使您需要实现一些其他逻辑,它通常也会更好,但如果您在设计时不需要在模型上进行其他计算和挂钩,它也会更好。

    是的,因此这不再是mongoose文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组

    这意味着即使这是一个mongoose文档,
    .save()
    也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容

    因此,您的方法可以归结为:

  • 不要使用投影并在代码中标识数组元素,请使用
    .save()

  • 只需对此进行原子更新即可修改文档。无论如何,可能更安全,因为您无法保证在阅读文档后其他内容没有修改文档,但当然会删除所有mongoose验证和挂钩:

    User.findOneAndUpdate(
        {
            "username": req.params.username,
            "friends.username": req.body.username
        },
        {
            "$set": { "friends.$": req.body }
        },
        function(err,user) {
    
           // do something with the now modified user
    
        }
    );
    
  • 因此,请注意,在某些情况下,不可能在响应中返回完整的文档对象,否则需要手动强制转换为完整的文档对象,但它可能与源对象不同


    第二种形式基本上是为了确保在两个操作之间不发布任何更改。即使您需要实现一些其他逻辑,它通常也会更好,但如果您在设计时不需要在模型上进行其他计算和挂钩,它也会更好。

    是的,因此这不再是mongoose文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组

    这意味着即使这是一个mongoose文档,
    .save()
    也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容

    因此,您的方法可以归结为:

  • 不要使用投影并在代码中标识数组元素,请使用
    .save()

  • 只需对此进行原子更新即可修改文档。无论如何,可能更安全,因为您无法保证在阅读文档后其他内容没有修改文档,但当然会删除所有mongoose验证和挂钩:

    User.findOneAndUpdate(
        {
            "username": req.params.username,
            "friends.username": req.body.username
        },
        {
            "$set": { "friends.$": req.body }
        },
        function(err,user) {
    
           // do something with the now modified user
    
        }
    );
    
  • 因此,请注意,在某些情况下,不可能在响应中返回完整的文档对象,否则需要手动强制转换为完整的文档对象,但它可能与源对象不同


    第二种形式基本上是为了确保在两个操作之间不发布任何更改。即使您需要实现一些其他逻辑,它通常也会更好,但如果您在设计时不需要在模型上进行其他计算和挂钩,它也会更好。

    是的,因此这不再是mongoose文档。它不能是一,因为您使用“投影”,这意味着不一定返回所有字段。事实上,这并不是因为您只返回所有可能字段中的“friends”数组

    这意味着即使这是一个mongoose文档,
    .save()
    也将完全无效,因为如果您尝试“强制转换”,最终只会用一个字段覆盖所有现有文档内容

    因此,您的方法可以归结为:

  • 不要使用投影并在代码中标识数组元素,请使用
    .save()

  • 只需对此进行原子更新即可修改文档。无论如何,可能更安全,因为您无法保证在阅读文档后其他内容没有修改文档,但当然会删除所有mongoose验证和挂钩:

    User.findOneAndUpdate(
        {
            "username": req.params.username,
            "friends.username": req.body.username
        },
        {
            "$set": { "friends.$": req.body }
        },
        function(err,user) {
    
           // do something with the now modified user
    
        }
    );
    
  • 因此,要意识到有一定的情况