基于 _id 字段操作 ref'd mongo 记录

Posted

技术标签:

【中文标题】基于 _id 字段操作 ref\'d mongo 记录【英文标题】:Manipulating ref'd mongo records based on _id field基于 _id 字段操作 ref'd mongo 记录 【发布时间】:2014-10-02 10:49:45 【问题描述】:

好的,所以我在 MEAN 应用程序(节点、猫鼬、mongo)中有一个非常简单的数据库设置,其中我有 Book 记录和用户记录。一本书有一个所有者,并且可以有任意数量的共享用户,这些用户存储在一个名为 sharedWith: 的字段中的数组中。最初,我使用电子邮件地址作为 _id 字段来存储用户记录。我现在意识到这对我来说是一个愚蠢的举动,因为如果有人想更改他们的电子邮件地址,它实际上会切断他们的书籍。

该应用还没有上线,所以这不是一个致命的错误。

我的问题是,一旦我将用户文档恢复为使用 _id 的原始哈希值,并将这些值存储在书籍文档中的 Owner 和 sharedWith 字段中,我是否必须查询每个哈希才能检索实际可用的用户数据?

我知道 mongoose 有一个 .populate() 方法可以解析子文档,但是对于插入它们呢?我会将用户发布为电子邮件地址,然后查询每个用户并存储生成的哈希值吗?我可以手动执行此操作,但我想确保在数据库本身中没有一些秘密的 mongo-sauce 可以执行此操作。

谢谢!

【问题讨论】:

【参考方案1】:

如果您在user 的前端有可用的_id。您可以通过将_id 添加到一本书的sharedWith 数组中来直接分享他一本书。但是如果前端没有用户的_id,则需要通过email查询手动获取_id,然后将_id存储在sharedWith中。至于检索书籍,populate确实是获取用户数据的最佳选择。

要与user 共享所有书籍,您可以执行以下操作,

Book.find(sharedWith:user1._id,function(err,docs) );

如果您在sharedWith 上使用index,则此查询可以提高效率,但这取决于您的用例。

【讨论】:

很酷,这就是我的想法,感谢您重申我在正确的轨道上。我也需要阅读有关索引的更多信息,因为我不确定如何做到这一点以及改进是什么。我需要查询,因为用户将通过原始电子邮件地址添加。谢谢!

以上是关于基于 _id 字段操作 ref'd mongo 记录的主要内容,如果未能解决你的问题,请参考以下文章

架构师成长记_第八周_08_ES-文档的基本操作

mongo数据库查询结果不包括_id字段方法

是否可以在 mongo 的组聚合后重命名 _id 字段?

mongo分组查询(转)

Mongo:引用同一集合中另一个文档的_id字段

Mongo 在 Meteor 应用程序中的 _id_ 字段上给出重复键错误