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

时间:2014-07-16 09:05:58

标签: php mongodb

我有两个这样的集合:

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创建的帖子? (按名称查询:Seth)

1 个答案:

答案 0 :(得分:1)

如果这是您的架构,则无法在一个查询中按名称获取给定用户的帖子。在您的应用程序中,您必须执行两个查询。第一个让ID获得NAME,第二个获得USER的帖子。这在MongoDB文档中称为“手动引用”,它可以像这样工作:

var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });

如果您确实想要使用一个查询执行此操作,那么您将不得不考虑使用DBRefs(您需要小心)在用户文档中的数组中嵌入帖子,或者在一些ODM如Mongoose的情况,使用“population”。

<强>更新

鉴于OP提供的新信息,如果您想查找尚未删除的用户的所有帖子,并且您不希望每次都迭代大型数组,我建议添加删除用户时可以设置为USER_DELETED的{​​{1}}字段。

因此,如果删除了true的用户,您将按如下方式运行查询:

{ "ID" : id }

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

db.Posts.update({ "USER" : id }, { "$set" : { "USER_DELETED" : true } });

或者你可以沿着这些方向做点什么。如果您知道所有文档的db.Posts.find({ "USER_DELETED" : { "$ne" : true } }); 字段设置为USER_DELETED,如果用户还在,那么您只需查询那些标记设置为false的文档。

当然,你仍然需要转换旧数据以遵循这种模式,但这可以通过一次性操作来实现,包括:

  1. 查找已删除的所有用户。
  2. 查找每个用户的帖子。
  3. 为每个帖子添加false标记。
  4. 这应该是解决您所面临问题的更好方法。