我觉得我遇到了一些非常简单的事情,但是如果能帮助我的话,我会很高兴。
我在客户端和服务器之间使用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
我可以完成所有操作,但不保存当前参考。
那么,我当然需要接近它呢?
答案 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>