如何查询两个集合在一次与mongodb


how to query two collections in once with 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的ID,我怎么能得到Seth创建的帖子?(查询By NAME: Seth)

如果这是您的模式,那么没有办法在一个查询中按名称获取给定用户的帖子。在您的应用程序中,您必须执行两个查询。第一个是在给定NAME的情况下得到ID第二个是在给定USER的情况下得到posts。这在MongoDB文档中被称为"手动引用",它将像这样工作:

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

如果你确实想用一个查询做到这一点,那么你将不得不考虑在用户文档中的数组中嵌入帖子,使用DBRefs(你需要小心),或者在一些odm的情况下,如Mongoose,使用"population"。

更新:

给定OP提供的新信息,在您想要查找未被删除的用户的所有帖子的情况下,如果您不想每次都遍历一个大数组,我建议添加一个USER_DELETED字段,该字段可以在用户被删除时设置为true

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

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

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

db.Posts.find({ "USER_DELETED" : { "$ne" : true } });

或者你可以这样做。如果您知道所有文档的USER_DELETED字段设置为false,如果用户还在,那么您可以查询那些将标志设置为false的文档。

当然,您仍然需要转换旧数据以遵循此模式,但这可以通过由以下操作组成的一次性操作来实现:
  1. 查找所有已删除的用户。
  2. 查找每个用户的帖子。
  3. 为每个帖子添加USER_DELETED标志。

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