我有两个集合,Group和User。最初,我的Group文档包含一系列User引用。但是我已经更改了我的映射,以便用户现在可以拥有对组的引用。我想知道如何编写查询来更新所有现有的用户文档以引用当前引用它们的组,然后删除组上的任何引用。
答案 0 :(得分:1)
我最初没有注意到你使用的语言 - 我必须在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的组列表,并在i中创建一个名为groups的列表,当我保存它时,会向用户文档添加一组组。
在PHP中应该不难做到
$ users = $ db->用户; $ groups = $ db-> groups;
//找到所有用户 $ ucursor = $ users-> find();
//遍历用户,查找拥有该用户的组, //使用组数组更新用户 foreach($ ucursor as $ u){ $ gcursor = $ groups-> find(...); 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}});
}