2016-08-15 9 views
0

Riakにマップリストを挿入するにはどうすればよいですか?私はSolr経由でリストを照会することもできます。ここRiak挿入リスト

私のターゲット・データ・モデルである:

{ 
    "id":"fa0b758cf8de4a40a54f215563bb483c", 
    "version":"g2wAAAABaAJtAAAADN4oTJvAfuENAAE8fWEBag==", 
    "creator":"ADMIN", 
    "creatorAppId":"RIAK_QA_APP1", 
    "creation":1470350862095, 
    "customerId":"68af96dae60ccac4e6", 
    "customerName":"John Appleseed", 
    "orders":[ 
     { 
     "orderId":"238dhu38ehj", 
     "orderType":"sporting", 
     "orderDescription":"Baseball Batt", 
     "dateOfPurchase":"5470354262012", 
     "delivery":"2 day express", 
     "processTimeMS":56, 
     "customerAttributes":[ 
      { 
       "key":"lastSessionDuration", 
       "value":"1 day" 
      }, 
      { 
       "key":"memberSince", 
       "value":"1470350862095" 
      } 
     ] 
     }, 
     { 
     "orderId":"9sdjh349hn", 
     "orderType":"furniture", 
     "orderDescription":"Sectional Couch", 
     "dateOfPurchase":"0970354262087", 
     "delivery":"Overnight", 
     "processTimeMS":78, 
     "customerAttributes":[ 
      { 
       "key":"lastSessionDuration", 
       "value":"1 day" 
      }, 
      { 
       "key":"memberSince", 
       "value":"1470350862095" 
      } 
     ] 
     }, 
     { 
     "orderId":"1009shdj473", 
     "orderType":"gaming", 
     "orderDescription":"FIFA 2016 - XBox One", 
     "dateOfPurchase":"1470354342013", 
     "delivery":"UPS Ground", 
     "processTimeMS":68, 
     "customerAttributes":[ 
      { 
       "key":"lastSessionDuration", 
       "value":"1 day" 
      }, 
      { 
       "key":"memberSince", 
       "value":"1470350862095" 
      } 
     ] 
     } 
    ] 
} 

現在のデータモデルは、別々に書き込むRiakに高い数をもたらす各注文アイテムを持続します。これは、メッセージングシステムが毎秒何千ものメッセージをプッシュし始めるとき、ボトルネックになります。したがって、ここでの意図(POCの一種)は、すべての注文商品を"orders"リストに統合し、バッチと同じように単一のリソースとして存続させることです。

Riakはあらゆる種類のバッチインサートをサポートしていますか?私は解決策を見つけることができませんでしたので、私は手動でデータをマージすることでこれをやります。

答えて

2

複雑なデータ構造をRiakに保存するために特別な作業を行う必要はありません。 Javaクライアントは、JSONへのシリアライズをサポートしています(ジャクソンジャパン、つまりアノテーションなど)。

DTOでデータをモデリングし、RiakのStoreValueコマンドでデータを送信することをお勧めします。このようなコードは動作します:

public class CustomerData { 
    private String id; 
    private String version; 
    // other customer fields 
    private List<Order> orders; 
} 

public class Order { 
    private String orderId; 
    private String orderType; 
    // other order fields 
} 

CustomerData data = ...; 
Location location = new Location(new Namespace(BUCKET_TYPE, BUCKET_NAME), key); 
StoreValue storeCommand = new StoreValue.Builder(data).withLocation(location).build(); 
riakClient.execute(storeCommand); 

また、あなたがMap'sObject'sList'sとしてこれをモデル化することができます。

個々の注文を更新または追加したり削除したり、顧客の日付を変更する場合は、リスト全体を読んで項目を変更してリスト全体を書き戻す必要がありますが、競合の可能性が増加する可能性があります(同じキーへの同時更新)。

Solrは、複雑なフィールド構造、多値フィールドおよび動的フィールドを確実にサポートします。 Creating Search Schemasをご覧ください。私はあなたのデータのどの部分を検索可能にしたいのかを知る必要があります。

いいえ、Riakはバッチインサートをサポートしていません。

UPDATE:あなたのケースでオーダーIDによってインデックス付けのためのカスタム(非ジェネリック)Solrのスキーマが

<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" /> 
+0

感謝を含める必要があります。個々の注文を更新する必要はありません。しかし、新しいオーダーアイテムを顧客オーダーリストに追加/追加する必要があります。私はそれがorderIdによって各注文を検索したいと思うでしょう。 私はあなたが言及したようにマップとオブジェクトのリストとしてそれをモデリングすることに興味があります。あなたはRiakでこれをモデル化する方法についていくつかの詳細を共有できますか? – user2208562

+0

同じ問題です。私が「個々の注文を更新する」と書いたとき、私は追加と削除も意味していました。構造体の一部である情報についても同様です。 'orderId'での検索は簡単です。' orders.orderId'を 'string'としてインデックスし、それらを複数値にする必要があります。 – vempo

+0

私は混乱しています。データを統合するか、モデルを個別のキーと値のペアとして保存しますか?たとえば、個別のユニークキー内の各注文と、顧客にリンクされた別のキー内の注文のリスト。 'Maps'と' Lists'によって、何らかの理由であなたのモデルを表すDTOクラスを作成したくなければ、私はJavaクラスを意味しました。 – vempo

関連する問題