Php MongoDB:更新对象集合以更改引用的拥有方

Php MongoDB:更新对象集合以更改引用的拥有方,php,mongodb,symfony,database,nosql,Php,Mongodb,Symfony,Database,Nosql,我有两个集合,组和用户。最初,我的组文档包含一个用户引用数组。但我已经更改了映射,以便用户现在持有对组的引用。我想知道如何编写一个查询来更新所有现有的用户文档,以引用当前引用它们的组,然后删除对这些组的任何引用。我没有注意到您最初使用的语言-我必须在Python中执行一些非常类似的操作,因此下面是我的示例代码: # I changed my collection names to users/groups hope I mapped them right :) users = db.users

我有两个集合,组和用户。最初,我的组文档包含一个用户引用数组。但我已经更改了映射,以便用户现在持有对组的引用。我想知道如何编写一个查询来更新所有现有的用户文档,以引用当前引用它们的组,然后删除对这些组的任何引用。

我没有注意到您最初使用的语言-我必须在Python中执行一些非常类似的操作,因此下面是我的示例代码:

# I changed my collection names to users/groups hope I mapped them right :)
users = db.users
groups = db.groups

for u in users.find():
    grp = groups.find( { "users" : u['userId'] } )
    u['groups'] = [ g['groupId'] for g in grp ]
    users.save(u)
基本上,对于每个用户,我在组中查找一个组列表,其中包含数组users中的userId,并在u中创建一个名为groups的列表,保存时将一个组数组添加到users文档中

用PHP来做应该不难

$users=$db->users; $groups=$db->groups

//查找所有用户 $ucursor=$users->find()

//遍历用户,查找拥有该用户的组, //使用组数组更新用户 外汇($u美元或美元){ $gcursor=$groups->find(…); foreach($gcursor作为$g){ ... } }

但这似乎只是一次操作,您可以在mongo shell中使用类似于:

var users = db.users.find();
while (users.hasNext()) {
   u = users.next();
   var gs = db.groups.find({"users":u.userId},{"groupId:1}).toArray();
   db.users.update({"groupId":groupId},{$set:{"groups":gs}});
}

关于真实数据的合理问题如何?我们应该猜猜你的数据吗?在一边有一个DBREF数组。。我需要将它们替换为引用文档上的字段。您还需要知道什么?这将向用户添加数组引用组。我认为从组中删除用户数组更简单。只需对每个组执行以下操作:db.groups.update({“groupId”:10},{$unset:{“users”:1}}),即可从groupId为10.oops的组中删除用户数组,但没有注意到php标记添加了一些关于在mongo shell或php中运行此操作的要点。mongo shell的查询正是我想要的。谢谢,工作很有魅力。