2016-11-10 13 views
3

これは私がbookingIdに基づいStatusを更新しようとしている私のdatabase structure更新ネストされた配列の値

{ 
"_id" : ObjectId("58243c430386650d78d12d53"), 
"email" : "[email protected]", 
"dentistName" : "Suzuka", 
"tempDetails" : [ 
    { 
     "tempName" : "Elsa", 
     "city" : "bangalore", 
     "tempEmail": "[email protected]", 
     "experience" : "5",  
     "hiredDates" : [ 
      { 
       "status" : "Accepted", 
       "bookingId" : "36Y0YM", 
      } 
     ], 
    }, 
    { 
     "tempName" : "Elsa", 
     "city" : "bangalore", 
     "tempEmail": "[email protected]", 
     "experience" : "5", 
     "hiredDates" : [ 
      { 

       "status" : "Hired", 
       "bookingId" : "92Qhd7", 
      } 
     ], 
    }, 
    { 
     "tempName" : "Elsa", 
     "city" : "bangalore", 
     "experience" : "5", 
     "tempEmail": "[email protected]", 
     "typeOfPractice" : "Oral Surgery", 
     "hiredDates" : [ 
      { 
       "status" : "Hired", 
       "bookingId" : "95kTe9", 
      } 
     ], 
    } 
] 
} 

です。私は値を更新することができません。私はJAVA MONGODBで次のコードを試しましたが、更新されていないようです。

BasicDBObject searchQuery = new BasicDBObject(); 

    List<BasicDBObject> andQuery = new ArrayList<BasicDBObject>(); 
    andQuery.add(new BasicDBObject("email", dentalEmail)); 
    andQuery.add(new BasicDBObject("tempDetails.tempEmail",tempEmail)); 


    searchQuery.put("$and", andQuery); 

    DBCursor cursor = col.find(searchQuery); 
    if (cursor.count() != 0) { 
    while (cursor.hasNext()) { 

     BasicDBList jobStatusList = (BasicDBList) cursor.next().get("tempDetails"); 

      for(int k=0;k<jobStatusList.size();k++) 
      { 
       BasicDBObject tempJobObject = (BasicDBObject) jobStatusList.get(k); 

       BasicDBList hiredDatesList = (BasicDBList) tempJobObject.get("hiredDates"); 


       for(int i =0; i<hiredDatesList.size();i++) 
       { 
        BasicDBObject hiredDatesObject = (BasicDBObject) hiredDatesList.get(i); 
        String dbBookingId = hiredDatesObject.getString("bookingId"); 

        if(dbBookingId.equalsIgnoreCase(bookingId)) 
        { 
         BasicDBObject doc = new BasicDBObject("$set", 
           new BasicDBObject().append("tempDetails."+k+".hiredDates."+i+".status", status)); 

         col.update(searchQuery, doc, false, false); 

         System.out.println(doc); 

        }else{ 
         result = false; 
        } 
       } 

私はBookingIdに基づいてレコードを更新するために苦労してきたよう親切にこの問題で私を助けて。ドキュメントをクエリで取得し、オブジェクトを反復処理します。もし予約されたものが一致すれば、レコードを更新しています。何が変わるべきか教えてください。

+1

「オブジェクトを反復し、予約IDが一致する場合はレコードを更新しています」というコードを間違いなく追加してください。また、何らかのエラーが発生している場合は、完全なスタックトレースを投稿してください。 – rafid059

+0

@RafiduzzamanSonnetエラーはありません。今すぐコードを追加しています。 – Rajeev

+0

印刷された検索と更新を使用してシェルコマンドにemを入れると、それは更新されますか? – HoefMeistert

答えて

1

データベースを正しくチェックしましたか?私はあなたのコードを完璧に正常にエラーなく実行することができますし、コレクションを更新します。

は、私はちょうど私が、次のやっている方法で作成しました:

private void performOperation() { 
    MongoClient mongo = new MongoClient("localhost", 27017); 
    MongoClient mongoClient = new MongoClient(); 
    DB db = mongoClient.getDB("test"); 
    DBCollection table = db.getCollection("vinay"); 

    logger.info("connected successfully"); 

    BasicDBObject searchQuery = new BasicDBObject(); 

    List<BasicDBObject> andQuery = new ArrayList<BasicDBObject>(); 
    andQuery.add(new BasicDBObject("email", "[email protected]")); 
    andQuery.add(new BasicDBObject("tempDetails.tempEmail", "[email protected]")); 

    searchQuery.put("$and", andQuery); 

    logger.info("executing :"+ searchQuery); 

    DBCursor cursor = table.find(searchQuery); 
    if (cursor.count() != 0) { 
     while (cursor.hasNext()) { 

      BasicDBList jobStatusList = (BasicDBList) cursor.next().get("tempDetails"); 

      for (int k = 0; k < jobStatusList.size(); k++) { 
       BasicDBObject tempJobObject = (BasicDBObject) jobStatusList.get(k); 

       BasicDBList hiredDatesList = (BasicDBList) tempJobObject.get("hiredDates"); 

       for (int i = 0; i < hiredDatesList.size(); i++) { 
        BasicDBObject hiredDatesObject = (BasicDBObject) hiredDatesList.get(i); 
        String dbBookingId = hiredDatesObject.getString("bookingId"); 

        if (dbBookingId.equalsIgnoreCase("36Y0YM")) { 
         BasicDBObject doc = new BasicDBObject("$set", new BasicDBObject() 
           .append("tempDetails." + k + ".hiredDates." + i + ".status", "New Status")); 

         table.update(searchQuery, doc, false, false); 

         logger.info(doc); 

        } else { 
         logger.info("no record find"); 
        } 
       } 
      } 
     } 
    } 
} 

を、私は予約IDが36Y0YMはに更新され、この状態で実行した後に - 「新しいステータスを」。

しかし、私はこれに気付きました。あなたがループを書いた方法...レコードが更新された後でも、それが繰り返され、 "レコードが見つかりません"というメッセージが印刷されるので、結果は偽に設定されます。結果に頼ると、間違っているだろう。

あなたが作成しようとしているロジックは分かっていませんが、あなたの書いたループに間違いがあると、mongodbのレコードを更新するコードに何も問題はありません。

+0

ちょっと私は私のコードをデバッグしている間に気づいた。原因は、更新後にフラグをtrueに設定する必要があるためです。私は今それを修正しました。助けてくれてありがとう: – Rajeev

+0

私の提案がうまくいったら、あなたは私の答えを受け入れるか、それにフラグを立てることができます。ありがとう –

関連する問題