$ addToSet和$ inc用于更新行

时间:2012-09-30 18:59:20

标签: php mongodb

我正在研究评级系统。当用户评分时,$ inc会增加该字段,addToSet会添加user_id以确保用户只点击一次评分。我正在检查user_id在更新之前是否已经在x字段中,但这是另一个我宁愿避免的查询。我是否可以达到此目的而无需编写其他查询?我的意思是,$addToSet只有在没有这样的价值时才会增加;我可以改为受影响的行吗?你能建议其他问题吗?

谢谢!

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

1 个答案:

答案 0 :(得分: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)
    )
)

如果x中尚未存在user_id,则只会进行更新。