1

データストアからオブジェクトを削除しようとしていますが、削除されません。コードを以下に示します。

MoIADocument moIADoc = new MoIADocument();
// update fields in moIADoc object
ds.save(moIADoc);

printDBDocs();

// create a query to retrieve objects
QueryResults<MoIADocument> foundResults = dao.find(query);
List<MoIADocument> list = foundResults.asList();

for (MoIADocument obj : list) {
    ds.delete(obj);
    MoDBIATopic topicBO = obj.getData().get(EnumChannelType.FACEBOOK).getData().get(GraphConstants.Topic_Default);
    topicBO.setInfluence(topicBO.getInfluence() * 25);
    ds.save(obj);
}
printDBDocs();

########################### 最初の出力結果 (JSON 形式) は次のとおりです。

最初の印刷結果

###########################forループ内 の objは次のとおりです。

for ループ内の obj

########################### forループの後、printステートメントは2つのオブジェクトを次のように与えます。

最後の印刷結果

によって古いオブジェクトが削除されないのはなぜmongoConstants.ds.delete(obj);ですか? idそして、フィールド広告に注釈を付けまし@Idたが、まだ 2 つのオブジェクトが同じで保存されていidます。これはどのように可能ですか?オブジェクトが同じ場合、オブジェクトを強制的に上書きするにはどうすればよいidですか?

@Id
@Indexed
private String id;

注: JSON で示されてidいるトップ レベルです。id

そして、クエリを次のように使用してみました:

Query<MoIADocument> query1 = ds.createQuery(MoIADocument.class).disableValidation();
query1.field("id").equal(obj.getId());
ds.delete(query1);

これも期待どおりに機能しません。

EDIT:

問題はクエリ結果のように見えます。上記を使用するquery1と、ゼロの結果が返されました。

4

2 に答える 2

0

String idas@Idフィールドの使用に問題がありました。実際にはそうあるべきですObjectId id。この変更により、クラスは次のようになります。

@Entity("Collection_IAGlobals")
public class MoDBIADocument {
    @Id
    @Indexed
    private ObjectId id;
    // some more fields
}

次のように更新します。

QueryResults<MoIADocument> foundResults = dao.find(query);
List<MoIADocument> list = foundResults.asList();
for (MoIADocument obj : list) {
    //do modifications in obj
    dao.save(obj);
}

deleteこの方法では、古いオブジェクトは必要ありません。古いオブジェクトを新しいオブジェクトに置き換えます(同じ を持っているためid)。

との両方dsを使用して正常に動作しdaoます。

しかし今、idフィールドの設定に関する新しい問題。文字列を次のように使用して設定した場合:

moIADoc.setId(new ObjectId("123456"));

次のエラーが発生します。

Exception in thread "main" java.lang.IllegalArgumentException: invalid ObjectId [123456]
    at org.bson.types.ObjectId.<init>(ObjectId.java:128)
    at org.bson.types.ObjectId.<init>(ObjectId.java:122)

次のような他の方法でも問題なく機能します。

// don't set id field
//OR
//set using default constructor of ObjectId
moIADoc.setId(new ObjectId());
//OR use other constructors e.g.
moIADoc.setId(new ObjectId(new Date(), 123456));

では、問題は、なぜ引数ObjectIdを取らないのかということです。String

于 2013-07-04T14:10:08.370 に答える