在 findOneAndUpdate 之后保存对猫鼬文档的引用

Saving reference to a mongoose document, after findOneAndUpdate

我觉得我遇到了一些非常简单的事情,但无法弄清楚,如果你能帮助我,我会很高兴。

我使用 mongoose + socket.io 作为客户端和服务器之间的 CRUD。当我使用套接字时,每个客户端的套接字都有一个私有范围,为了将来在不进行 db find 调用的情况下使用,我想存储我曾经为该用户找到的 mongoose 文档的引用。

一位客户正在创建 Room:

var currentroom;

client.on('roomcreate', function (data) {       
   currentroom = new Room({
      Roomid: id,
      UsersMeta: [UserMeta],
      ///other stuff///
      })
    currentroom.save(function (err, room) {
    if (err) console.log(err);
    else console.log('success');
    });
});

然后,只要我愿意,只要接到另一个创作者的电话,我就可以

currentroom.Roomnaid = data;
curretroom.save()

它工作正常,问题是 - 我不明白如何在不创建时获得相同的参考,但是 Room 搜索,目前我正在使用它进行搜索:

 Room.findOneAndUpdate({ Roomid: roomid }, { $push: { UsersMeta: UserMeta}}, { new: false }, function (err, room) {
    if (err) console.log(err);
    console.log('room output:');        
    console.log(room);
    client.emit('others', room);
 })

事实是,在一次通话中我想:
1: 在数据库中查找文档,
3:发送给用户(更新前状态),
4:更新找到的文档,
2:保存参考(当前更新的文档)

使用 findOneAndUpdate 我可以做所有的事情,但不能保存当前参考。 那么,我需要如何处理呢?

像这样;

Room.findOne({ Roomid: roomid }, function (err, oldRoom) {
    //make changes to oldRoom
    //then save it like this
    oldRoom.save(function(err,newRoom) {
      //newRoom is updated document
      //now you have reference to both old and new docs
    });
 })

在路的尽头,我发现我试图弄错。存储由不同用户访问的 doc 引用(实例)的想法显然是不好的,因为它会导致这些实例之间的数据冲突。此外,使用单独查找和保存的方法可能会导致竞争条件和冲突,因为它是非原子操作,最好使用 findOneAnd*** 让 mongoose\mongoDB 自行处理数据库请求查询并确保不会发生冲突.