2016-06-01 2 views
0

私は冪等級にしたいREST APIを書いています。私はネストされた配列とidempotencyと今のところ苦労しています。 product_notesの項目を1回のアトミック操作で更新したいと思います。それはMongoDBでも可能ですか?あるいは、代わりにオブジェクトとして配列を格納する必要がありますか(この記事の最後に私の例を見てください)?たとえば、upsertの動作を模倣することは可能ですが、配列は可能ですか?MongoDBのネストされた配列の等価性は可能ですか?

{ 
username: "test01", 
product_notes: [ 
    { product_id: ObjectID("123"), note: "My comment!" }, 
    { product_id: ObjectID("124"), note: "My other comment" } ] 
} 

私はちょうどupdateコマンドと$setが、何product_idはまだ配列にない場合に使用する既存のproduct_nodeのためのメモを更新する場合。それから私はupsertをしたいと思いますが、私が知っている限り、それは埋め込みドキュメント/配列演算子の一部ではありません。 、この問題を解決し、それを冪等にする

一つの方法は、ただproduct_idusernameの間で関係する新しいコレクションproduct_notesを追加することです。 これは、ドキュメントベースのデータベースの目的に違反しているように感じます。

別の解決策:このについての何かを持っている私よりも多くの経験を積んビットが共有する

{ 
username: "test01", 
product_notes: { 
    "123": { product_id: ObjectID("123"), note: "My comment!" }, 
    "124": { product_id: ObjectID("124"), note: "My other comment" } } 
} 

誰ですか?

+0

ユーザーはどのくらいのコメントを保存できますか?モンゴバージョン? – profesor79

+0

私はあなたが目指しているものを知っていると思います。しかし、スキーマ設計を気にする必要はありません。モデルを作成する正しい方法であるかどうかは気にしないでください。私はそれが10〜100個の製品の間にあると思います。示されたコードは正確なプロジェクトではなく、問題がどこにあるのかの例です。私はすでに独自のコレクション内のproduct_notesで解決策を作っています...うまくいきます。 –

答えて

0

あなたの要件を理解することは、ユーザーに一意の製品ID(配列)を保存したいということです。

あなたは「ユーザ名」と「username.product_id」複合一意インデックスを作成することができます。そのため、同じ製品IDが配列に挿入されたときに、サービスが冪等でないようにするためにコード内で捕捉して処理できる例外があります。

新しい要素を配列(product_notes)に追加するという点では、主キー(トップレベルの属性 - 例 "_id")でドキュメントを取得し、次に新しい要素を配列に追加し、ドキュメントを更新します。既存の配列要素に属性を更新するという点で

: - アゲイン

  1. 、主キーによって文書を取得する(すなわち、トップレベルの属性 - 例「_id」)
  2. 正しいプロダクトIDを検索配列データを
  3. を繰り返すことにより発生が "[]" アレイの発生に置き換え

    product_notes.[].note 
    
関連する問題