У меня есть такой документ:
{
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"
}
Я хочу Запросить весь субдокумент, у которого есть пользователь: "bob" Пример в PHP: db.posts.find(array ("comments.user" => "bob");
Я знаю, что этот синтаксис не будет работать для меня. И если синтаксис верен, операции поиска будут отображаться как:
{
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"
},
Как я могу изменить схему документа для этого?
Yo не нужно менять схему документа, вы можете найти комментарии от Боба с агрегацией:
db.posts.aggregate([{$unwind:"$comments"},{$project:{"comment_text":"$comments.comment_text","user":"$comments.user","time":"$details.time",_id:0}},{$match:{"user":"bob"}}])
$match
для user : "bob"
. Это в конечном итоге избыточно, но установка начального соответствия позволит вам использовать индекс и сократить количество документов, которые должны быть обработаны остальной частью конвейера.
bob
я думаю, что это должно быть решено с помощью агрегации.