2015-11-09 3 views
1

У меня есть класс Java под названием Project с свойством usersArrayList<User>, который содержит объекты User.Morphia: Фильтрующий элемент в ArrayList с использованием Morphia

Моя коллекция проектов выглядит

[ 
    { 
    "_id" : ObjectId("56410150d277de02f3b67495"), 
    "name" : "my-project", 
    "users" : [ 
     { 
     "id" : "58b5eb81-35b2-4719-87ad-e5eea76a478f", 
     "name" : "john", 
     "lastName" : "Doe" 
     } 
    ] 
    } 
] 

Я хочу, чтобы найти пользователя с определенным UUID внутри этого свойства. Я могу найти его в MongoDB со следующим запросом: db.getCollection('projects').find({"users.id": "58b5eb81-35b2-4719-87ad-e5eea76a478f"})

Как получить те же результаты с помощью Morphia?

Я попытался это:

Project project = datastore.createQuery(Project.class).filter("users.id", user_id).get(); 

И это:

Project project = datastore.find(Project.class, "users.id", user_id).get(); 

Но не повезло :(

Любая помощь

Я ожидаю получения:

{ 
     "id" : "58b5eb81-35b2-4719-87ad-e5eea76a478f", 
     "name" : "john", 
     "lastName" : "Doe" 
} 
+0

Можете ли вы, возможно, изменить свой вопрос, чтобы включить некоторые выборочные данные в 'projects' коллекции, результаты запроса найти и ваш ожидаемый выход? – chridam

+0

Я включил дополнительную информацию в вопрос. Я не получаю результатов, когда пытаюсь выполнить запрос с помощью Morphia – fiunchinho

+0

Спасибо за обновление, это намного лучше и понятнее! – chridam

ответ

0

$elemMatch проекция для извлечения массива. Монго запрос, который вы хотите создать isFinite

db.project.findOne(
    {"users.id": "58b5eb81-35b2-4719-87ad-e5eea76a478f"}, 
    { 
     "_id": 0, 
     "users": { 
      "$elemMatch": { "id": "58b5eb81-35b2-4719-87ad-e5eea76a478f" } 
     } 
    }).users[0] 

или использовать оператор $ projection, выступающие элементы массива на основе некоторых условий от оператора запроса. В вашем случае, если ваш оператор запроса будет использовать точечную нотацию для запроса массива изображений, где он имеет, по меньшей мере, элемент:

db.project.findOne(
    {"users.id": "58b5eb81-35b2-4719-87ad-e5eea76a478f"}, 
    { "_id": 0, "users.$": 1 } 
).users[0]; 

В морфии (непроверенный), вы можете захотеть попробовать оператор в elem

Project project = datastore.createQuery(Project.class) 
          .filter("users elem", BasicDBObjectBuilder.start("id", "58b5eb81-35b2-4719-87ad-e5eea76a478f")) 
          .retrievedFields(true, "users.$") 
          .get(); 

или

Project project = datastore.createQuery(Project.class) 
          .field("users.id").eq("58b5eb81-35b2-4719-87ad-e5eea76a478f") 
          .retrievedFields(true, "users.$") 
          .get(); 

или свободно интерфейс hasThisElement() метод

User user = new User(); 
user.setId("58b5eb81-35b2-4719-87ad-e5eea76a478f");  

Query<Project> query = datastore.createQuery(Project.class) 
     //.field("users.id").equal("58b5eb81-35b2-4719-87ad-e5eea76a478f") 
     .field("users").hasThisElement(user) 
     .retrievedFields(true, "users.$");