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


MongoDB: updating collection of objects to change owning side of reference

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

起初我没有注意到你使用的语言 - 我不得不在 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)

基本上,对于每个用户,我都会在组中查找在数组用户中包含userId的组列表,并在您中制作一个名为组的列表,当我保存时,它会将组数组添加到用户文档中。

在PHP中应该不难做到

$users = $db->用户; $groups = $db->组;

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

遍历用户,找到拥有用户的组, 使用组数组更新用户 foreach ($ucursor as $u) { $gcursor = $groups->查找( ... ); foreach ($gcursor as $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}});
}