2012-01-16 2 views
2

У меня есть морфий схема, похожая на этот:Морфий/MongoDB: Доступ к «встраивание» объект из @Embedded объекта

@Entity 
class BlogEntry { 
    @Embedded 
    List<BlogComment> comments 
} 

@Embedded 
class BlogComment { 
    String content 
    Long authorId 
} 

(код выше только для иллюстрации)

Я пытаюсь получить конкретный блогкомментарий, чтобы обновить его новым контентом. У меня есть соответствующий объект BlogEntry, и у меня есть authorId, который, скажем, для целей этого вопроса, что этих двух вместе достаточно, чтобы однозначно идентифицировать правильный Блогкомментарий.

Мой вопрос в том, что в BlogComment явно не содержится ссылка на его «родительский» объект BlogEntry, так как я могу написать запрос morphia для извлечения этого BlogComment? Что-то вроде:

//fetch the unique comment corresponding to this blog entry and this author ID. 
BlogComment comment = ds.find(BlogComment.class, "blogEntryId =", blogEntry.id) 
         .filter("authorId", authorId) 
         .get(); 

ответ

3

Поскольку у вас уже есть объект записи в блоге, почему бы не использовать простой цикл Java для его фильтрации?

@Entity 
class BlogEntry { 

    @Embedded 
    List<BlogComment> comments 

    public BlogComment findCommentByAuthorId(String authorId) { 
     if (null == authorId) return null; 
     for (BlogComment comment: blogEntry.comments) { 
      if (authorId.equals(comment.authorId) return comment; 
     } 
     return null; 
    } 

} 
+0

Благодарим за отзыв. Я считал, что цикл BlogComments работает, но похоже, что это будет медленным. Еще одна возможность, которую я рассмотрел, - добавить в BlogCom поле «blogEntryId», которое содержит идентификатор родительского объекта. Это может быть быстрее, но, похоже, не будет явно явным образом хранить идентификатор объекта внедрения внутри каждого внедренного объекта. Есть ли неявный дескриптор родителя? – mindthief

+1

Перемещение по списку - это операция в памяти, должно быть намного быстрее, чем вы получаете что-либо из базы данных, потому что последнее включает в себя межпроцессорную связь, диск IO (может быть отказано из-за кеша) и т. Д. Другое дело, что вы не может позволить запросу морфии возвращать только встроенный объект. –

+0

Ну ладно, хороший вызов в режиме «доступ к памяти» и доступ к базе данных. Да, похоже, Morphia-запросы даже с использованием «точечной нотации» будут возвращать только родительские объекты, а не внедренные объекты. Использование цикла, кажется, путь, спасибо за вашу помощь! – mindthief

Смежные вопросы