2014-11-20 4 views
0

У меня есть документ, как это:Запрос Все поддокумент MongoDB

{ 
    author: "ABC1", 
    text:"this is a Post", 
    details: { 
     time: "14/05/2015", 
     Edit: "none" 
    }, 
    comments: [ 
     { 
       comment_text: "Hello", 
       user: "alan", 
        time:"20/05/2014 20:44" 
      }, 
     { 
       comment_text: "Hi Every One", 
       user: "bob", 
        time:"20/05/2014 20:44" 
      }, 
     { 
       comment_text: "Good morning , Alan", 
       user: "Alan", 
       time:"20/05/2014 20:44" 
      }, 
     { 
        comment_text: "I'm bob", 
        user: "bob", 
        time:"20/05/2014 20:44" 
      }, 
       ], 
    category: "IT" 
    } 

я хочу, чтобы все Запрашивание вложенного документа, который у пользователя: «боб» Пример в PHP: db.posts.find (массив ("комментарии .user «=>» боб ");

Я знаю, что синтаксис не будет работать для меня И если синтаксис верно, найдите операции будет отображаться как:.

   { 
        comment_text: "I'm bob", 
        user: "bob", 
        time:"20/05/2014 20:44" 
       }, 
       { 
        comment_text: "Hi Every One", 
        user: "bob", 
        time:"20/05/2014 20:44" 
       }, 

Как я могу изменить схему документа для этого?

+0

что именно вы хотите найти comments.user = «боб»? и только показывает данные пользователя 'bob'. Я думаю, что это должно решаться с помощью агрегации. – Yogesh

ответ

2

Yo не нужно менять схему документа, вы можете найти комментарии от Боба с агрегацией:

db.posts.aggregate([{$unwind:"$comments"},{$project:{"comment_text":"$comments.comment_text","user":"$comments.user","time":"$details.time",_id:0}},{$match:{"user":"bob"}}]) 
+0

Я также предлагаю положить начальный '$ match' для' user: "bob" '. Это в конечном счете избыточно, но первоначальное совпадение позволит вам использовать индекс и сократить количество документов, которые должны быть обработаны остальной частью конвейера. – wdberkeley