1

私は、顧客が複数のアドレスを持つことができる顧客データローダーに取り組んでいます。顧客が見つからない場合は、顧客を作成して住所を追加します。顧客が存在する場合は、次のように新しいアドレスを追加するだけです。

    DBObject findCustomer = new BasicDBObject();
    findCustomer.put("email", custEmail);

    //check for existing customer
    DBObject newCustomer = customerCollection.findOne(findCustomer);

    if (newCustomer == null) {
        //INSERT    
        newCustomer = new BasicDBObject();
        newCustomer.put("firstname", firstname);
        newCustomer.put("lastname", lastname);
        newCustomer.put("email", custEmail);
        newCustomer.put("password", custData.getPassword());
        newCustomer.put("softwaretime", new Date());
    }

    DBObject newAddress = new BasicDBObject();
    City tempCity = new City();
    tempCity = addressData.getCity();

    newAddress.put("type", addressData.getType());
    newAddress.put("line1", addressData.getLine1());
    newAddress.put("line2", addressData.getLine2());
    newAddress.put("city", tempCity.getCity());
    newAddress.put("state", tempCity.getState());
    newAddress.put("postal", tempCity.getZip());
    newAddress.put("country", tempCity.getCountry());

    newCustomer.put("address", newAddress);

    customerCollection.save(newCustomer);

これは、新規のお客様に有効です。問題は、顧客がすでに存在する場合、新しいアドレスが既存のアドレスを上書きすることです。

複数のアドレスを保持できるように、新しいアドレスを顧客に追加するにはどうすればよいですか?

私が見つけたものから、私はシェルを介した「プッシュ」でこれを達成できるはずです。しかし、BasicDBObjectのメソッドとして「push」は表示されません。

4

2 に答える 2

2

address を単一の住所文書ではなく、住所のリストにしたい。したがって、あなたが獲得したい新規顧客の場合:

newCustomer.put("アドレス", [newAddress])
customerCollection.save(新しい顧客)

そして、あなたが望む既存の顧客のために

customerCollection.update(newCustomer, {$push: {"addresses": newAddress}})

申し訳ありませんが、私は Java API を知りません。適切なオブジェクトを作成するには、上記のコードを調整する必要があります。

于 2012-05-06T15:16:23.310 に答える
1

結局のところ、ロジックははるかに単純になる可能性があります。「電子メール」で顧客を取得する必要はありません (これが顧客の一意の識別キーであると想定しています) 更新するだけです。

findCustomer.put("email", custEmail); // search query for the customer email

// construct your newAddress object the same way you already are

BasicDBObject custMod = new BasicDBObject();
custMod.put("$addToSet", newAddress);
customerCollection.update(findCustomer, custMod, true /* upsert */, false /* multi */ );

現在のロジックの大きな問題は、マルチスレッドで動作しないことです。顧客を確認できますが、そこにはありません。挿入するオブジェクトを構築している間、別のスレッドが既にそれを行っています。address オブジェクトは単一のフィールドではなく配列であるため、$addToSet を使用すると、配列が存在する場合は配列に追加されますが、新しい顧客を作成する場合は、住所が配列として作成されます。

于 2012-05-08T16:42:34.350 に答える