如何在更新查询中使用MongoID作为键

时间:2011-08-22 00:53:41

标签: php mongodb

我在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 个答案:

答案 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 operatorsmongodb docs on update operators