我想对db做一个漂亮而优雅的调用,但经常遭受缺乏猫鼬体验的困扰。
希望我不会太烦人,只有当我的docs-google-Stack-digging技能失败时,我才会试图解决Stack Overflow问题。
我想做什么:
- 在DB中找到一份文件
此doc中的-populate数组(Schema
中的此数组是来自Objectid
UserMeta
的{{1}}数组}
- 把它插到一些更好的地方
-update在Schema
中发现另一个_id
提交给doc的文档
- 保存这个更新到db&作为var UserMeta
在最后两个步骤中出现问题,因为我无法填补' doc,我已经得到了响应和更新 - 进一步保存。
目前我是这样做的,没有任何人口:
currentroom
我可以通过从parrent Room.findOne({ Roomid: roomid }, function (err, oldRoom) {
client.emit('others', oldRoom);
oldRoom.UsersMeta.push(currentUser._id);
oldRoom.save(function (err, newRoom) {
currentroom = newRoom;
});
})
到这个UserMeta
doc的toJSON来强制复制所需的文档,并且只需手动维护它们。但如果有办法通过方便的Room
工具自动执行此操作,我想采取这种方式。当然,为了好奇,
这是我上一个问题Saving reference to a mongoose document, after findOneAndUpdate的延续 - 只是一句话,你真的不需要去那里
更新:我需要在使用mongoose
的查询中运行populate()
,因此作为回应,我已经填充了findOne
的<{1}}
oldRoom
upd2:所以我想出来,如果我在已经填充的_id
中推送新的Room.findOne({ Roomid: roomid }).populate('UsersMeta').exec(function (err, oldRoom) {
if (err) {
console.log(err);
}
else if (oldRoom) {
console.log(oldRoom.UsersMeta)
client.emit('others', oldRoom.UsersMeta);
oldRoom.UsersMeta.push(currentUser._id);
oldRoom.save(function (err, newRoom) {
currentroom = newRoom;
console.log(newRoom);
});
}
else { console.log('nothing found') };
})
并将其保存在db中,它将自动显示为_id
&#39的集合应该如此。然而,我现在很困惑,如果我将继续使用这个oldroom
引用,因为它已经被傀儡,我怎么能安全地从填充数组中删除一些东西而不完全从db中删除填充的条目。
upd3:啊,我的脑袋弄得一团糟。出于一些奇怪的原因,我认为对于每个套接字客户端保存在变量中的doc的引用将始终指向db中的最新doc,并且我将能够通过它使用此doc来使用find db工具不止一次得到这个参考...我需要重新考虑我的数据库逻辑
SO
那么有一个问题。如果用户连接到_id
,这是来自currentroom
的文档,并且用户是套接字用户,即他具有个人范围,我可以在其中存储他的个人会话详细信息。我可以以某种方式存储直接链接到这个特定的Rooms
doc,以便通过整个数据库来搜索这个房间,例如,如果用户更改了房间的名称。如果我需要搜索 - 似乎更好的做法是保存用户所在的房间ID,然后只需通过此ID查找数据库中的空间并更改它的名称,我是对的吗? / p>
答案 0 :(得分:0)
以下是仅使用ID获取UserMeta的查询
Room.findOne({ Roomid: roomid },function (err, oldRoom) {
});