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)
    )
);
4

1 回答 1

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.

于 2012-09-30T20:35:56.857 回答