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

时间:2015-02-25 13:28:24

标签: node.js sockets mongoose

我觉得我遇到了一些非常简单的事情,但是如果能帮助我的话,我会很高兴。

我在客户端和服务器之间使用mongoose + socket.io作为CRUD。因为我正在使用套接字,所以每个客户端的套接字都有一个私有作用域,为了将来使用而不进行db查找调用,我想存储一个mongoose文档的引用,我曾经为这个用户找到过。< / p>

一位客户正在筹集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:在db中找到doc,
3:将其发送给用户(处于预更新状态),
4:更新找到的文件,
2:保存引用(当前更新的文档)

使用findOneAndUpdate我可以完成所有操作,但不保存当前参考。 那么,我当然需要接近它呢?

2 个答案:

答案 0 :(得分:2)

喜欢这个;

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
    });
 })

答案 1 :(得分:0)

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