【发布时间】:2015-02-27 08:13:27
【问题描述】:
我想给 db 打一个漂亮而优雅的调用,但一直缺乏 mongoose 经验。
希望我不会太烦人,我只是在我的 docs-google-Stack-digging 技能失败时才尝试解决 Stack Overflow。
我想做什么:
-在数据库中查找文档
-在此文档中填充数组(Schema 中的此数组是来自UserMetaSchema 的Objectids 数组)
- 通过套接字将其发送到更好的地方
-update 找到另一个 _id 的文档,引用 UserMeta 中的文档
- 将此更新保存到 db 并作为将来参考 var currentroom
问题出现在最后两个步骤中,因为我无法“取消填充”文档,我已经得到了响应并更新并进一步保存。
目前这就是我在没有任何人口的情况下这样做的方式:
Room.findOne({ Roomid: roomid }, function (err, oldRoom) {
client.emit('others', oldRoom);
oldRoom.UsersMeta.push(currentUser._id);
oldRoom.save(function (err, newRoom) {
currentroom = newRoom;
});
})
我可以通过 toJSON 从parrent UserMeta 蛮力复制所需的文档到这个Room 文档,然后手动维护它们。但是,如果有一种方法可以通过方便的mongoose 工具自动执行此操作,我想采用这种方式。当然,为了好奇。
这是我之前的问题Saving reference to a mongoose document, after findOneAndUpdate的延续- 只是备注,你真的不需要去那里
更新:事情是我需要运行populate() 以查询findOne,因此作为响应,我得到oldRoom 已经填充了_ids
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') };
})
upd2:所以我发现,如果我在已经填充的oldroom 中推送新的_id 并保存它,在 db 中它将自动显示为应有的 _id 的集合。然而,我现在很困惑,如果我将继续使用这个 currentroom 参考,因为它已经被填充了,我怎样才能安全地从填充的数组中删除一些东西而不完全从数据库中删除填充的条目。
upd3:啊,我只是把脑子弄得一团糟。由于某些奇怪的原因,我认为每个套接字客户端对保存在变量中的文档的引用将始终指向数据库中的最新文档,并且我将能够通过它来处理该文档,从而阐明使用 find db 的需要不止一次获得此参考的工具...我需要重新考虑我的数据库逻辑。
所以
那么有一个问题。如果用户连接到Rooms,这是来自RoomSchema 的文档,并且用户是套接字用户,即他有一个个人范围,我可以在其中存储他的个人会话详细信息。我能否以某种方式存储指向此特定Room 文档的直接链接,以阐明如果用户更改房间名称时需要通过整个数据库搜索该房间。如果我需要搜索 - 保存用户所在房间的 id 似乎是一种更好的做法,然后只需通过该 id 在数据库中查找房间并更改其名称,对吗?
【问题讨论】:
-
能否请您重新表述一下这个问题,我不确定到底是什么问题
-
好吧,我需要在找到
doc后发送、更新和保存它。在这个文档的架构中有UsersMeta: [{ type: mongoose.Schema.Types.ObjectId, ref: 'UserMeta'}],。据我了解,要在UsersMeta(人口主题)中添加另一个_id,并保存找到的doc,我需要不填充它。然而,我需要在保存之前从找到的doc中发送UserMeta,并且它必须被填充。 -
如果您不想要 UserMeta,可以删除 newRoom.UserMeta
-
我希望它在
doc中,但仅由它的_id呈现,以便能够在将来再次使用UserMetas填充此doc,事实上在每种此类打电话给分贝。原因是自动跟踪UserMeta集合中的所有更改。即,如果房间中的某些UserMetas在其原始UserMeta集合中被更改,我只想在需要时在Room上调用populate(),并在其中获得实际最新UserMetas的空间,这就是为什么我需要将Room保存在无人居住的状态,以便将来能够按人口更新其UserMeta。 -
据我了解,无论如何我都无法通过
delete something从猫鼬文档中删除任何内容,除非我先将其转换为JSON/object