2016-11-25 11 views
0

mongoshellですでに希望のクエリを実行できますが、JavaとMongoOperationsを使用して同じクエリを作成する必要があります。MongoOperationsを使用してMongoの複数の配列エントリを削除します

私は非常によく似ているが、鉱山には2つあり、$gte$ltの演算子を使用しているため、1つの条件しかありません。ここで働いてMongoのクエリがあります:

db.getCollection('example').update({"idVar": "desiredValued"}, { $pull: { "listaHoras": { $gte: ISODate("2016-11-06T05:50:00.000Z"), $lt: ISODate("2016-11-06T06:30:00.000Z")}}}) 

サンプルドキュメント:私はJavaでDate変数としてISODATE、および文字列変数としてdesiredValueがあるでしょう

"_id" : ObjectId("58221b4610a3c71f1894ce75"), 
"idVar" : "56b11259272f5515b05d70bc", 
"date" : ISODate("2016-11-06T03:00:00.000Z"), 
"listaHoras" : [ 
    ISODate("2016-11-06T05:40:00.000Z"), 
    ISODate("2016-11-06T06:30:00.000Z"), 
    ISODate("2016-11-06T06:40:00.000Z") 
    ] 

。あなたが見ることができるように、これは目的のクエリと同等ではありません、

BasicDBObject match = new BasicDBObject("idVar", desiredValue); // to match your document 
BasicDBObject update = new BasicDBObject("listaHoras", new BasicDBObject("itemID", "1")); 
coll.update(match, new BasicDBObject("$pull", update)); 

しかし:

はこれまでのところ、私は、一例として、前述の質問を使用して、次のことをやっています。 $pullの一致は"itemID"と "1"が一致しているためです。私は知らないし、$gte$ltを同じクエリで正しく使用する方法も見つけられませんでした。どちらか片方だけを使用する方法も、両方を使用する方法もありません。

"更新 - 更新されたオブジェクトを含む更新ドキュメントまたは既存のオブジェクトを操作する$演算子"に記載されているように、これを行うことができます。

誰でもどのように行うことができますか?また、JavaのDateタイプがMongoのISODATEと一致する場合は、

+0

テストのサンプルドキュメントを追加してください。 – Veeram

+0

サンプル文書が追加されました。 –

答えて

1

私は解決策を見つけることができました。これはVeeramが答えとして投稿したものと似ていますが、少し異なります。私は単に彼のupdateCriteriaを削除し、その場所にBasicDBObjectを使用しました。

はここで完全なコードがどのように見えるかです:startendは、法によって受け取った日付変数です

Query findQuery = new Query(); 
Criteria findCriteria = Criteria.where("idVar").is(idVar); 
findQuery.addCriteria(findCriteria); 
Update update = new Update().pull("listaHoras", new BasicDBObject("$gte", start).append("$lte", end)); 
mongoOps.updateMulti(findQuery, update, "CollectionName"); 

。また、MongoはデフォルトのタイムゾーンとしてUTCを使用するので、希望の値を削除するためには時間を適切にフォーマットする必要があります。

1

以下のように試すことができます。これにより、listaHoras配列から2つの項目が削除されます。

Query findQuery = new Query(); 
    Criteria findCriteria = 
      Criteria.where("idVar").is("56b11259272f5515b05d70bc"); 
    findQuery.addCriteria(findCriteria); 

    LocalDate startDt = LocalDate.of(2016, 11, 6); 
    LocalTime startTm = LocalTime.of(5, 40, 0); 

    LocalDate endDt = LocalDate.of(2016, 11, 6); 
    LocalTime endTm = LocalTime.of(6, 35, 0); 


    Date start = Date.from(LocalDateTime.of(startDt, startTm).toInstant(ZoneOffset.UTC)); 
    Date end = Date.from(LocalDateTime.of(endDt, endTm).toInstant(ZoneOffset.UTC)); 

    Query updateQuery = new Query(); 
    Criteria updateCriteria = 
      Criteria.where(null).gte(start).lt(end); 
    updateQuery.addCriteria(updateCriteria); 
    mongoOperations.updateMulti(findQuery, update, "example"); 
+0

実行されますが、レコードは削除されません。私はDateとISODATEが本当に互換性があるかどうかをチェックし、何かテストをして、私が見つけた何でも投稿を更新します。 –

+0

私は正しいアップデートcritieriaを含めるように答えを更新しました。遅れてしまい申し訳ありません。 – Veeram

関連する問題