首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mongodb一次查询两个集合

如何使用mongodb一次查询两个集合
EN

Stack Overflow用户
提问于 2014-07-16 17:05:58
回答 1查看 62关注 0票数 0

我有两个这样的集合:

代码语言:javascript
复制
var Users = [
    {
        'ID' : 1,
        'NAME' : 'Seth'
    },
    {
        'ID' : 2,
        'NAME' : 'John'
    }
];

var Posts = [
    {
        'ID' : 1,
        'TEXT' : 'blalalalalala...',
        'USER' : 1
    },
    {
        'ID' : 3,
        'TEXT' : 'blalalalalala....',
        'USER' : 2
    }
];

没有Seth的ID,我如何才能获得Seth创建的帖子?(按名称查询: Seth)

EN

回答 1

Stack Overflow用户

发布于 2014-07-16 17:23:48

如果这是您的模式,则无法在一个查询中按名称获取给定用户的帖子。在您的应用程序中,您必须执行两个查询。第一个获取给定NAMEID,第二个获取给定USER的帖子。这在MongoDB文档中被称为“手动引用”,它的工作原理如下:

代码语言:javascript
复制
var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });

如果您确实想用一个查询来实现这一点,那么您将不得不考虑在用户文档内的数组中嵌入帖子,使用DBRefs (您需要小心使用),或者对于某些ODM,如Mongoose,使用"population“。

更新:

考虑到OP提供的新信息,如果您希望查找尚未删除的用户的所有帖子,并且不希望每次都迭代大型数组,我建议添加一个可以在删除用户时设置为trueUSER_DELETED字段。

因此,如果删除了具有{ "ID" : id }的用户,您将按如下方式运行查询:

代码语言:javascript
复制
db.Posts.update({ "USER" : id }, { "$set" : { "USER_DELETED" : true } });

这会将该用户的所有帖子标记为属于已被删除的用户。因此,当您想要检索仍然存在的所有用户的帖子时,您可以运行:

代码语言:javascript
复制
db.Posts.find({ "USER_DELETED" : { "$ne" : true } });

或者你可以沿着这些路线做一些事情。如果您知道所有文档的USER_DELETED字段都设置为false,并且用户仍然在附近,那么您可以只查询那些将标志设置为false的文档。

当然,您仍然需要转换旧数据以遵循此模式,但这可以通过包含以下内容的一次性操作来实现:

为每个帖子查找deleted.

  • Finding的所有用户,并为每个帖子设置USER_DELETED标志。

这应该是解决你面临的问题的更好方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24776617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档