Как использовать MongoID в качестве ключа в запросе на обновление - PullRequest
0 голосов
/ 22 августа 2011

Я создал запрос в PHP, который используется для добавления пользователя в массив. Сейчас он проверяет, существуют ли они, а если нет, то добавляет их в массив. Вот полный код:

try{ $this->users_db->update( 
    array( 
      '_id' => new MongoId($user_id) , 
      new MongoId( $group_id ) => array('$nin'=>USER_GROUPS) 
    ), 
    array(
     '$push' => array(USER_GROUPS => array( GROUP_ID => new MongoId($group_id), USER_GROUP_NOTIFY => true ) ) 
    ) 
); }
catch(Exception $e)
{ return false; }

Проблема в том, что PHP выдает мне предупреждение «Недопустимый тип смещения», поскольку MongoId () является объектом, и объекты нельзя использовать в качестве ключей в массивах. Любые идеи о том, как обойти это?

1 Ответ

1 голос
/ 22 августа 2011

Я думаю, у вас есть порядок ваших "аргументов" до $nin в обратном направлении.Ваш запрос эквивалентен чему-то вроде этого в оболочке mongo:

db.users.update({_id: ObjectId("..."), ObjectId("..."): {$nin: ["user_groups"]}}, ...);

, которая читается как английский, слева направо, когда произносится "$nin" как "not in".Более правильно, согласно грамматике MongoDB, произношение «не содержит», поэтому ваш запрос фактически говорит что-то вроде «где какой-то ObjectId не содержит этот массив», что не имеет большого смысла, когда произносится вслух.

Имея это в виду, ваш запрос должен выглядеть следующим образом:

db.users.update({_id: ObjectId("..."), user_groups: {$nin: [ObjectId("...")]}}, ...);

При возникновении подобных проблем с обновлениями или удалениями часто бывает полезно попробовать часть спецификации запроса в качестве аргумента для find() или findOne() чтобы определить, что там не так.Как только вы сможете найти документ, который хотите обновить, вы можете переписать его как update(), remove() и т. Д.

Кроме того, вы должны знать, что существует $addToSet атомныйоператор, который выполняет такую ​​проверку для вас атомарно в базе данных.Вы можете попробовать:

db.users.update({_id: ObjectId("...")}, {$addToSet: {user_groups: ObjectId("...")}});

РЕДАКТИРОВАТЬ: Для будущих ссылок на OP и другие запрашивающие, см. документы mongodb по операторам запросов и документы mongodb при обновленииоператоры .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...