我正在研究评级系统。当用户评分时,$ 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 :(得分: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,则只会进行更新。