2017-12-14 10 views
0

冒頭で、同様の質問がすでに尋ねられていることを強調したいと思います。 私はMongodbを初めて使っているので、問題があります。MongodbとJava:配列フィールドに指定された値を持つドキュメントを見つける

私がしたいのは、「カテゴリ」フィールド(つまり文字列の配列)にメソッドパラメータとして指定されたカテゴリが含まれている、「shopRepository」というコレクションからすべてのショップを取得するメソッドを作成することです。

次のようにshopRepository収集のための文書構造が構成されています

{ 
    "name": "corte", 
    "openingHours": "Mi-Fr 8-18", 
    "categories": ["food", "drinks"], 
    "mallId": "123", 
    "longitude": "1", 
    "latitude": "2", 
    "ownerId": "123x" 
} 

私はそのようなルックスを書かれている方法:

public List<Shop> getByCategory(String category) { 

    BasicDBObject query = new BasicDBObject("categories", new BasicDBObject("$all", Arrays.asList(category))); 
    List<Shop> shops = new ArrayList<Shop>(); 
    try (MongoCursor<Shop> cursor = collection.find(query).iterator()) { 
     while (cursor.hasNext()) { 
      shops.add(cursor.next()); 
     } 
    } 

    return shops; 
} 

私はHTTPステータスを取得していメソッドを呼び出すと500 - java.lang.NullPointerException

更新:

これは、スタックされたトレースは:

SEVERE: Servlet.service() for servlet [Jersey REST Service] in context with path [/WebServiceProject] threw exception [java.lang.NullPointerException] with root cause java.lang.NullPointerException 
at restLayer.ShopResource.getShopByCategory(ShopResource.java:114) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76) 
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148) 
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191) 
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200) 
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103) 
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493) 
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415) 
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104) 
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:316) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:298) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:268) 
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289) 
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256) 
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703) 
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416) 
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

ShopResource.getShopByCategoryは、私は上記の「getByCategory」メソッドを呼び出す方法です。それが助け場合は、私もそれを含める:

@GET 
@Path("category/{category}") 
@Produces({ MediaType.APPLICATION_JSON}) 
public Response getShopByCategory(@PathParam("category") String category) { 
    List<Shop> shops = shopRepository.getByCategory(category); 
    if (shops == null) { 
     return Response.status(Status.NOT_FOUND).build(); 
    } 
    List<Container> response = new ArrayList<Container>(); 
    for(Shop q : shops) { 
     response.add((Container) stripAttributes(q)); 
    } 
    return Response.ok(response).build(); 
} 
+0

これは114行目ですか?スタックトレースは、問題のステートメントを指す必要があります。 ShopResource.java:114 – dnickless

答えて

0

ではなく、このような$all$in演算子を使用します。

BasicDBObject query = new BasicDBObject("categories", new BasicDBObject("$in", Arrays.asList(category))); 

$allcategoriesがするドキュメントのクエリで指定すべて値が含まれていなければならないことを意味します一致。

+0

お返事ありがとうございました。私が使用するもの:$ inまたは$ allのいずれかで、私はまだ例外を取得します...私はデータベースをチェックし、それは私が探しているカテゴリのショップが確実に含まれています。 – akretatitap

+0

スタックトレースで質問を更新する – Dummy

+0

今すぐ更新しました – akretatitap

関連する問題