2016-07-10 22 views
0
{ 
    id:1, list:{ 
    time:9:00AM, 
    branch:[cse,it], 
    count:30, 
    }, id:2, list:{ 
    time:9:30AM, 
    branch:[cse,it], 
    count:20, 
    } 
} 

Der Code unten ist neuer Zweig anhängen auf Basis von id und Zeit in json DokumentServletException in mongodb Abfrage

public DBObject appendRoute(String id, String time, String groups, 
    int count) { 
     DBCollection coll = db.getCollection("groups"); 
     BasicDBObject queryDocument = new BasicDBObject("id", id) 
      .append("list.time", time).append("list.count", count); 
     List<DBObject> sourceDocument = coll.find(queryDocument).toArray(); 
     BasicDBObject elementToArray = new BasicDBObject("list.branch", 
      branch); 
     BasicDBObject pushElement = new BasicDBObject("$push", elementToArray); 
     coll.update(queryDocument, pushElement); 

     System.out.println(sourceDocument); 
     return sourceDocument.get(0); 
    } 

Dieser Code unten Fehler wirft:

javax.servlet.ServletException: com.mongodb.WriteConcernException: { 
"serverUsed" : "localhost/127.0.0.1:27017" , "connectionId" : 1 , 
"err" : "cannot use the part (list of list.count) to traverse the 
element ({list: [ { time: \"9:00AM\", branches: [ ece ], count: \"20\" 
}, { time: \"9:05AM\", branch: [ cse ], count: \"20\" }, "code" : 
16837 , "n" : 0 , "ok" : 1.0} 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:392) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345) 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

Bitte lassen Sie mich wissen, was ist das Problem in meinem Code?

Antwort

0

Ihre Mongo-Abfrage scheint korrekt zu sein. Wenn Sie die neueste Version des Java-Treibers verwenden, verwenden Sie bitte den folgenden Code. Es sollte dein Problem lösen.

Ich habe keine Java-Treiberversion. Also konnte ich das Problem nicht replizieren.

Mongo Abfrage: -

db.groups.updateOne({"_id" : ObjectId("5782abde4e0f937abf0fcbd3"), 
    "list.time" : "9:00AM" , "list.count" : 30}, {"$push" : {"list.branch" : "ece"}}); 

ich Ihre Lösung mit der neuesten Java-Treiber geschrieben haben. Es funktioniert gut.

<dependency>  <groupId>org.mongodb</groupId>  <artifactId>mongo-java-driver</artifactId>  <version>3.2.2</version> </dependency> 

Code: -

Der Code unten wurde getestet und funktioniert einwandfrei.

import org.bson.Document; import org.bson.types.ObjectId; 

import com.mongodb.MongoClient; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Updates; import com.mongodb.client.result.UpdateResult; 

public class MongoGroupsExample { 

    public static void main(String[] args) {  MongoClient client = new MongoClient();   MongoDatabase database = client.getDatabase("test"); 

     int count = 30; 

     Document findDoc = database.getCollection("groups") 
       .find(Filters.and(Filters.eq("_id", new ObjectId("5782abde4e0f937abf0fcbd3")), 
         Filters.eq("list.time", "9:00AM"), Filters.eq("list.count", count))) 
       .first(); 

     System.out.println(findDoc.toJson()); 

     UpdateResult updateResults = database.getCollection("groups").updateOne(
       Filters.and(Filters.eq("_id", new ObjectId("5782abde4e0f937abf0fcbd3")), 
         Filters.eq("list.time", "9:00AM"), Filters.eq("list.count", count)), 
       Updates.push("list.branch", "ece")); 

     System.out.println(updateResults.getModifiedCount()); 

    } 

}