我在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()是一个对象,对象不能用作数组中的键。关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
我认为你向$nin
倒退了“论据”的顺序。您的查询等同于mongo shell中的类似内容:
db.users.update({_id: ObjectId("..."), ObjectId("..."): {$nin: ["user_groups"]}}, ...);
当发出“$nin
”作为“不在”时,从左到右读起来像英语。更正确的是,通过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 docs on query operators和mongodb docs on update operators。