MongoDB $ set运算符。尝试更新对象数组内的对象

时间:2019-02-28 04:00:30

标签: node.js mongodb mongoose

我正在尝试在Node.js API中更新MongoDB模式中的特定字段。

具体来说,该功能可以接受用户(接受者)的朋友请求。 friend 将存储在 friends 数组中,并且当用户( accepter )接受请求时, friends 数组中 friend 的状态将从“待处理”更改为“已接受”

从其他类似的帖子中,我了解到$ set运算符允许我在 friends 数组中进行查找和编辑,但是数据库不会更新为“ accepted”。到目前为止,似乎没有一种解决方案有效。

其他信息:

  • 访问路由时,我的HTTP客户端挂起
  • 我的accepterID有效(当我console.log时,我可以查看整个用户对象( accepter
  • requesterID也有效

任何帮助将不胜感激!我对此是全新的!

以下是函数:

 User.findById(accepterID)
          .then(accepter => {
            accepter.update(
              { "friends.friendID" : requesterID }, 
              { $set: { "friends.$.status" : "accepted" }},
            )
            res.json(accepter)
          })
        }

以下是架构:

const UserSchema = new Schema({

  method: {
    type: String,
    enum: ['local', 'google', 'facebook'],
    required: true
  },

  friends: [
    {
      status: {
        type: String,
        enum: ['requested', 'pending', 'accepted']
      },
      addedWhen: {
        type: Date
      },
      friendID: {
        type: Schema.Types.ObjectId,
        ref: 'users'
      }
    }
  ],

  local: {
    firstName: {
      type: String
    },
    lastName: {
      type: String
    },
    email: {
      type: String,
      lowercase: true
    },
    password: {
      type: String,
    },
    date: {
      type: Date,
      default: Date.now
    }
  },

});

1 个答案:

答案 0 :(得分:0)

尝试使用这样的update会给我一个过时的警告(似乎update是集合update的别名),然后崩溃,因为“不能使用部分( friends.status)来遍历元素” 。不确定为什么会这样。

所以您的HTTP客户端挂起是因为您无法正确处理错误? (无论如何,res.json本身不会失败。)

独立于您的HTTP调试,我的更新工作如下:

User.findById(accepterID).then(accepter => {
  // updateOne works as well, but no way it gives the fresh doc
  User.findOneAndUpdate(
    { _id: accepterID, 'friends.friendID': requesterID },
    { $set: { friends.$.status: 'accepted' } },
    { new: true },
    (err, freshAccepter) => {
      if (err) throw err;
      res.json(freshAccepter);
    }
  );
});

或更短,因为您不需要原始接受者,所以不需要包装findById