Mongoose / node.js如何查找,填充,填充内容,以及“减少”#39;并更新

时间:2015-02-25 18:41:51

标签: node.js mongodb mongoose

我想对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>

1 个答案:

答案 0 :(得分:0)

以下是仅使用ID获取UserMeta的查询

Room.findOne({ Roomid: roomid },function (err, oldRoom) {

});