2011-08-22 33 views
0

我在PHP中創建了一個用於將用戶添加到數組的查詢。現在它會檢查它們是否存在,以及它們是否將它們添加到數組中。下面是完整的代碼:如何在更新查詢中使用MongoID作爲鍵

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

我認爲你的順序是你的「參數」爲$nin倒退。您的查詢相當於蒙戈外殼是這樣的:

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

+0

美麗!最後一部分非常有用! –