2012-09-30 24 views
1

我正在評估系統上工作。當用戶評價時,$ inc遞增該字段,addToSet添加user_id以確保用戶只點擊一次費率。我正在檢查在更新之前user_id是否已經在x字段中,但這是另一個我寧願避免的查詢。我可以達到這個目的而不必寫另一個查詢嗎?我的意思是,$addToSet只會增加如果沒有這樣的價值;我可以獲得受影響的行嗎?你能提出其他疑問嗎?

謝謝!

..->update(
    array("_id" => $idob), 
    array(
     '$inc'  => array($type => (int) 1), 
     '$addToSet' => array("x" => (int) $user_id) 
    ) 
); 
+0

var_dump($ type);'give? – hakre

+0

我不知道如何分開執行$ addtoset會很昂貴。我認爲在一次更新中你不能擁有$ inc和$ addtoset,但值得測試,我總是忘記這些東西。另外你是什麼意思「我可以受到影響的行」? – Sammaye

+0

var dump沒有給我足夠的信息,受影響的行,就像mysql的受影響的行,它會給我受影響的條目的數量,所以我現在如果它被添加或不。 – johna

回答

2

好的我看到了問題。

..->update(
    array("_id" => $idob), 
    array(
     '$inc'  => array($type => (int) 1), 
     '$addToSet' => array("x" => (int) $user_id) 
    ) 
); 

的問題是,你需要一個條件$inc有那麼它只$inc■如果它確實增加了設置。

由於唯一索引是從文檔atm的根開始工作的,因此這對於唯一索引是不可能的。你也可能想用$inc作爲預聚合的一種形式,或者不是。

一種方法可以是:

update(
    array('_id' => $idob, 'x' => array('$nin' => array($user_id))), 
    array(
     '$inc' => array($type => 1), 
     '$push' => array('x' => (int)$user_id) 
    ) 
) 

如果USER_ID尚不在x存在這樣只會做更新。

+0

,幫了我很多:)謝謝你的幫助:) – johna

+0

@johna關於受影響的行。您可以在更新結束時添加「安全」=> true參數。這將返回一個數組,其中包含一個名爲「n」或「updated」的字段,它會告訴您它已更新了多少個字段。您可以在選項塊中找到安全參數:http://www.php.net/manual/en/mongocollection.update.php – Sammaye