1

私は評価システムに取り組んでいます。ユーザーが評価すると、$inc はフィールドをインクリメントしaddToSet、user_id を追加して、ユーザーが評価を 1 回だけクリックするようにします。更新する前に user_id が既に x フィールドにあるかどうかを確認していますが、これは避けたい別のクエリです。別のクエリを作成しなくても、この目的を達成できますか? $addToSetつまり、そのような値がない場合にのみ追加します。代わりに影響を受ける行を取得できますか? 他のクエリを提案できますか?

ありがとうございました!

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

1 に答える 1

2

OK、問題がわかりました。

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

問題は、そこに条件が必要であるため、セットに追加する場合に$incのみs になることです。$inc

ユニーク インデックスはドキュメント atm のルートから機能するため、これはユニーク インデックスでは不可能です。$incまた、事前集計の形式として使用したい場合や、そうでない場合もあります。

1つの方法は次のとおりです。

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 に答える