2012-05-08 2 views
0

У меня есть две коллекции, группа и пользователь. Первоначально в моем документе Group содержался массив ссылок пользователей. Но я изменил свое сопоставление, чтобы теперь пользователи имели ссылку на группу. Мне интересно, как я могу написать запрос, чтобы обновить все существующие документы пользователя, чтобы ссылаться на группу, которая в настоящее время ссылается на них, а затем удалять ссылки на группы.MongoDB: обновление коллекции объектов для изменения владельца ссылки

+0

Как о разумном вопросе с реальными данными? Должны ли мы угадать ваши данные? –

+0

Существует массив DBRefs с одной стороны .. и мне нужно поменять их на поле в ссылочном документе вместо этого. Что еще нужно знать? – MDrollette

ответ

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 в пользователе массива, и я создаю список, называемый группами в u, и когда я его сохраняю, добавляется массив групп для документов пользователей.

Должно быть не трудно сделать это в PHP

$ пользователей = $ db-> пользователей; $ groups = $ db-> groups;

// найти всех пользователей $ ucursor = $ users-> find();

// перебирает пользователь, найти группы, которые имеют пользователь, // пользователя обновления с множеством групп Еогеаспа ($ ucursor, как $ и) { $ gcursor = $ groups-> найти (...) ; Еогеасп ($ gcursor в $ г) { ... }}

Но это похоже на работу один раз, вы можете сделать это в Монго оболочки, используя что-то похожее на:

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}}); 
} 
+0

Вопрос помечен [php] ... – BoltClock

+0

Это добавляет массив, ссылающийся на группы. Я предполагаю, что избавиться от массива пользователей от групп более просто. Просто выполните для каждой группы: db.groups.update ({"groupId": 10}, {$ unset: {"users": 1}}), чтобы удалить массив пользователей из группы с groupId 10. –

+0

oops, not notice тег php –

Смежные вопросы