【问题标题】:Mongoose/node.js how to find, populate, do stuff, 'depopulate' and updateMongoose/node.js 如何查找、填充、执行操作、“删除”和更新
【发布时间】:2015-02-27 08:13:27
【问题描述】:

我想给 db 打一个漂亮而优雅的调用,但一直缺乏 mongoose 经验。

希望我不会太烦人,我只是在我的 docs-google-Stack-digging 技能失败时才尝试解决 Stack Overflow。

我想做什么:

-在数据库中查找文档
-在此文档中填充数组(Schema 中的此数组是来自UserMetaSchemaObjectids 数组)
- 通过套接字将其发送到更好的地方
-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

标签: node.js mongodb mongoose


【解决方案1】:

这是获取仅带有 id 的 UserMeta 的查询

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

});

【讨论】:

  • 这正是我之前所做的,正如您在问题中看到的那样,问题是我将如何在此查询中填充找到的文档,以便对已填充的文档进行进一步操作?
  • 如猫鼬文档中的示例 mongoosejs.com/docs/populate.html populate 必须在查询中,从这个文档中做出这个假设我什至没有尝试调用 oldRoom.populate() 也许这是一个问题,会尝试就在当下
  • 好吧,看来我可以这样称呼它oldRoom.populate('UsersMeta', function(err, populated) {console.log(populated), console.log(oldRoom)}),但现在oldRoompopulated 是相同的 - 即都已填充,因此我不能重复使用未填充的oldRoom 进一步更新使用新的_id 并保存.ah 等等我犯了一个错误,检查
  • 重新检查,是的,它们都被填充了。
  • 我现在看到的唯一方法是首先更新,保存,然后填充,转换为 JSON,以某种方式摆脱更新的部分并发送给用户。我想如果我推动它进行更新,我只需要摆脱数组中的最后一行。如果推送顺序,即通过添加到 mongoose doc 中的数组末尾来保证其正常行为
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 2016-03-15
  • 2011-10-01
  • 2011-07-04
  • 2017-04-20
  • 2020-02-10
  • 2017-10-27
  • 2013-04-08
相关资源
最近更新 更多