在 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 自行处理数据库请求查询并确保不会发生冲突.
我觉得我遇到了一些非常简单的事情,但无法弄清楚,如果你能帮助我,我会很高兴。
我使用 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 自行处理数据库请求查询并确保不会发生冲突.