6

特定のイベントのカテゴリを見つけるために実行しているイベントコレクションがあり、$pushステートメントを使用して他のコレクションを更新しています。問題は、2つのイベントが同じカテゴリにある場合、重複が作成されることです。これは望ましくありません。

私はアップサートについて知っていますが、それがこれに関して行くための最良の方法であるかどうかわかりませんか?そして、「$push」ステートメントで機能するアップサートを実際に作成する方法に関しては少し混乱しています。

これが私のアップデートの現在の様子です。

self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}})

..どこ:

UserCampaign = {
        "id": campaign['id'],
        "name": campaign['name']
}

「UserCampaign」は時々同じ情報でいっぱいになります。私のコレクションはおそらく非常に膨大になるので、これをできるだけ効率的に完了したいと思います。

TLDR; 重複するリスクを冒さずに、「プッシュ」を使用して見つかったドキュメントの配列を更新したいと思います。

4

3 に答える 3

11

私の問題に対するより良い答えを見つけました:

$ addToSetを使用することで、重複は作成されませんでした(すべての辞書をリストに追加することで、以前に作成された場所で重複がないことも確認しました)。

self.users.update({"user_id": event['userid']}, {'$addToSet': {'campaigns': UserCampaigns[i]}})

$ pushを使用したばかりの場合は、usersコレクション内の「キャンペーン」に常に重複する要素が作成されます。これは、アップサートの有無にかかわらず発生しました。

何らかの理由で$eachは機能しませんでしたが、必須ではありませんでした。PyMongoがそれを処理してくれると思います。

于 2012-06-18T10:14:17.020 に答える
9

MongoDBDocsおよびPyMongoDocsに従って、更新の3番目の引数をtrueとして送信します。

self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}}, True)
于 2012-06-13T14:25:03.660 に答える
1

クリスチャンは彼の答えに正しい議論を持っているので、私はその部分をそのままにしておきます(彼の答えを支持しました)。

ただし、重複の回避などについても質問します。

ここで重要なのは、更新クエリの基準部分が目的のレベルに固有であることを確認することです。アップサート(または更新)は、渡した基準と同じくらい良いものです。アップサートは、条件に一致するドキュメントが見つからない場合は新しいドキュメントを挿入し、更新は、渡された条件が見つかった場合にのみ$ push(または指定された更新)を実行します(複数のドキュメントがある場合は複数更新できます) docも見つかりました)。

あなたの場合、基準部分は次のとおりです。

UserCampaign = {
        "id": campaign['id'],
        "name": campaign['name']
}

この部分が一意であり、問​​題がないことを確認してください。これが複数のドキュメントと一致する可能性がある場合は、重複することになります。

于 2012-06-13T14:46:02.837 に答える