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

Php 如何使用mongodb一次查询两个集合,php,mongodb,Php,Mongodb,我有两个这样的收藏: var Users = [ { 'ID' : 1, 'NAME' : 'Seth' }, { 'ID' : 2, 'NAME' : 'John' } ]; var Posts = [ { 'ID' : 1, 'TEXT' : 'blalalalalala...', 'USER' : 1 }, {

我有两个这样的收藏:

var Users = [
    {
        'ID' : 1,
        'NAME' : 'Seth'
    },
    {
        'ID' : 2,
        'NAME' : 'John'
    }
];

var Posts = [
    {
        'ID' : 1,
        'TEXT' : 'blalalalalala...',
        'USER' : 1
    },
    {
        'ID' : 3,
        'TEXT' : 'blalalalalala....',
        'USER' : 2
    }
];
var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });

没有赛斯的ID,我怎么能得到赛斯创建的帖子?(按名称查询:Seth)

如果这是您的模式,则无法在一次查询中按名称获取给定用户的帖子。在应用程序中,必须执行两个查询。第一个获得
ID
的是给定的
名称
,第二个获得给定的
用户的帖子
。这在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
    }
];
var id = db.Users.findOne({ "NAME" : "Seth" });
var posts = db.Posts.find({ "USER" : id });
如果您确实想通过一个查询来实现这一点,那么您必须研究在用户文档中的数组中嵌入post,使用(您需要小心),或者在某些ODM(如Mongoose)的情况下,使用“”

更新:

鉴于OP提供的新信息,如果您希望查找尚未删除的用户的所有帖子,并且不希望每次都遍历大型数组,我建议添加一个
USER\u deleted
字段,当用户被删除时,该字段可以设置为
true

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

db.Posts.update({ "USER" : id }, { "$set" : { "USER_DELETED" : true } });
然后将该用户的所有帖子标记为属于已删除的用户。因此,当您想要检索所有仍然存在的用户的帖子时,您可以运行:

db.Posts.find({ "USER_DELETED" : { "$ne" : true } });
或者你可以按照这些思路做点什么。如果您知道所有文档都将
USER\u DELETED
字段设置为
false
(如果用户仍在),那么您可以只查询那些将标志设置为false的文档

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

  • 正在查找已删除的所有用户
  • 查找每个用户的帖子
  • 为每个帖子添加
    USER\u DELETED
    标志
    这应该是解决您面临的问题的更好方法。

    您需要研究客户端加入,这个问题已经被问了很多次,快速搜索将为您提供有关该主题的大量信息谢谢,我真正的问题是:我有一个名为Users的集合,包含9000个项目。另一个名为Posts的集合有15000个项目。有时用户将被删除,但帖子不会被删除,我希望获得未删除的用户发布的所有项目。var users=[{'ID':1,'NAME':'Seth','deleted':0},{'ID':2,'NAME':'John','deleted':1000112} ......... ];如果我查询所有未删除的用户,我将得到一个超大数组。使用大数组查询帖子?看起来这不是一个好的性能解决方案。或者是否有另一种模式可以执行正确的查询?那么,对于未被删除的用户来说,文档是什么样子的呢。它没有删除的字段吗?一个解决方案是,当你删除一个用户时,你用一个像userDeleted这样的标志来标记他的所有帖子。这是一个只发生一次的写操作。然后,当您检索帖子时,您可以只查询那些没有标记的帖子。我将更新我的答案以包含此内容。@Winmain,我更新了我的答案以反映您刚才提到的问题。希望有帮助。