2014-01-24 4 views
0

나는 Java에 매우 익숙하다. 나는 mongoDB에 아주 새로운 있습니다. 내가 fooType으로 검색 할 수있는 검색 기능을 구현하기 위해 노력하고morphia를 사용하여 mongodb의 객체 목록 내에서 검색

{ 
    "_id" : "1234", 
    "name" : "bill", 
    "products" : [ 
     { 
      "fooType" : "bar", 
      ..... 
     }, 
     { 
      "fooType" : "oof", 
      ..... 
     }   
    ], 
    "status" : "Truncated" 
}, 
{...} 

:

은 내가 이렇게 보이는 컬렉션이 있습니다. 표준 mongodb 구문을 사용하여 작업 쿼리를 만들 수 있지만 morphia를 사용하여 구현하는 방법을 파악할 수는 없습니다.

작업 MongoDB의 쿼리 :

db.Clients.find({products: {$elemMatch: {fooType: "bar"}}}) 

내가 어떤 성공하지 않고 노력했습니다 일부 내용 (일부) 코드 : 객체를 기대하기 때문에

DatastoreImpl ds; 
q = ds.createQuery(Clients.class).field("products").hasThisElement("fooType"); 

는 분명히 문제가 해결되지 않습니다. hasThisElement를 사용하는 방법에 대해 머리를 감싸는 것처럼 보일 수는 없습니다. 더 이상이 문제를 해결할 가장 좋은 방법인지 확신 할 수 없습니다.

+0

ds.createQuery (Clients.class) .field ("products.fooType"). hasThisElement ("bar")'를 사용해 보셨습니까? –

+0

같은 오류 :'잘못된 매개 변수 : 객체가 예상 됨 ($ elemMatch) ' –

답변

3

hasThisElement은 매개 변수의 개체를 예상하므로 String "fooType"또는 "bar"를 사용할 수 없습니다.

class Clients { 
String id; 
String name; 
List<Product> products = new ArrayList<Product>(); 
String status; 
} 

class Product { 
String fooType; 
.... 
} 

당신이 아래 products에 필터 객체를 만들어야합니다, $elemMatch을 사용하고 hasThisElement()이 필터 객체를 사용하려면 :

는이 컬렉션에 대한 다음과 같은 클래스가 있다고 가정

Product filterProduct = new Product(); 
filterProduct.fooType = "bar"; 
Query q = ds.createQuery(Clients.class).field("products").hasThisElement(filterProduct); 
+0

원래이 표시를 올바르게했으나 확실하지 않습니다. fooType으로 검색 할 수 있기를 원합니다. 이것은 fooType = "bar"인 모든 객체를 찾는 것이 아니라 내가 찾고있는 객체와 정확하게 일치해야 할 필요가있는 것 같습니다. –

+0

배열 요소 내에서 둘 이상의 구성 요소를 일치시키지 않으려면 $ elemMatch 연산자를 사용할 필요가 없습니다. –

+2

hasThisElement (filterProduct)는 다음과 같이 해석됩니다. { "products": { "$ elemMatch": { "fooType": "bar"}}}이 쿼리는 ds.createQuery (Clients.class) .field ("products" . 필드 제품에 "fooType": "bar"가있는 모든 문서를 반환하려면 db.Clients.find ({ "products.fooType": "bar"}) 쿼리를 사용하면됩니다. morphia의 코드는 다음과 같습니다. ds.createQuery (Clients.class) .filter ("products.fooType", "bar"); –