запрос морфии на основе одного поля глубоко вложенного объекта - PullRequest
6 голосов
/ 09 января 2012

Я хочу получить объект на основе идентификатора (или другого отдельного поля) объекта, который вложен в 2 уровня из объекта, который я хочу получить.Пример для демонстрации:

Я хочу найти все сообщения в блоге, которые были прокомментированы конкретным пользователем.

Blog
  List<Comment>
    ignoredField1
    ignoredField2
    User
      id
      name
      ignoredField3

Комментарии и пользователи @ ссылаются на их родительские объекты.

После прочтения этого поста http://groups.google.com/group/morphia/browse_thread/thread/57090ef1bd2f3e74?pli=1

Я понимаю, как найти блоги с комментариями, где ignoredField1 / 2 имеет определенное значение, но я хочу перейти дальше.

Я пробовал следующее, но, поскольку все поля комментариев сравниваются, совпадений нет

q.field("comments").hasThisElement(new Comment(new User("name")));

1 Ответ

4 голосов
/ 09 января 2012

Я думаю, вам придется сделать это за несколько шагов:

  1. Получить идентификатор объекта пользователя

    ObjectId id = userObj.getId();
    
  2. Получить все комментарии этого пользователя

    Query q = ds.createQuery(Comment.class);
    q.field("user").equal("name");
    q.retrievedFields(true, "_id"); // just get the IDs
    
  3. Получить все блоги с этими комментариями ..

Однако , есть лучшие способы:

  1. Вставить комментарии, а не ссылаться на них. Они не имеют особого смысла как отдельный объект. Тогда вы можете сделать:

    Query q = ds.createQuery(Blog.class);
    q.field("comments.user").equal("name");
    
  2. Добавьте ссылку из комментариев обратно в блог - например, поле ObjectId, называемое "блог". Тогда вы можете сделать:

    Query q = ds.createQuery(Comment.class);
    q.field("user").equal("name");
    q.retrievedFields(true, "blog"); // only get the blog ObjectIds
    

, чтобы получить все идентификаторы объекта Blog, а затем загрузить их на следующем шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...