2016-06-16 3 views
2

У меня есть суб-события принадлежность к событий принадлежащих к пользователя, и я знаю, что имя пользователя - как я могу получить список суб-событий?Сделать вложенные запросы в MongoDB 3.0.7

Действительно ли это происходит в правильном направлении? Или это совсем не так?

db.subevents.find({_id: {$in: 
    db.events.find({_id: {$in: 
     db.users.find({"username":"userx"},{_id:1})}},{_id:1})}}) 

Edit: Вот пример структуры данных:

/* Event */ 
{ 
    "_id" : "XjhAqqNBkezKY3mdN", 
    "name" : "My event", 
    "userId" : "FiKsAAAgBb7cNoPH7" 
} 
/* Subevent */ 
{ 
    "_id" : "WkYAqBXNpJryp7rum", 
    "name" : "The subevent", 
    "eventId" : "hQXNzX3jbWppbAYFH" 
} 
/* User */ 
{ 
    "_id" : "RTHh5srhLMQp625zF", 
    "username" : "userx" 
} 
+4

Вы могли бы разместить образец своей структуры данных? – KaSh

+0

Какова ваша версия MongoDB? – styvane

+0

Это MongoDB 3.0.7 – Cos

ответ

1

Следуя совету profesor79, чтобы использовать три различные вызовы, я соединял это решение для получения всех вспомогательных событий, принадлежащих пользователю:

var userIds = db.users.find({"username":"userx"}).map(function(user) { 
    return user._id; 
}); 
var eventIds= db.events.find({userId: {$in:userIds}}).map(function(event) { 
    return event._id; 
}); 
db.subevents.find({eventId:{$in:eventIds}}); 
0

Единственный способ это сделать 3 ddifrent звонки в Монго 3.0.7

  1. GetUSerData
  2. GetEventData
  3. GetSubEventData

Поскольку у вас есть реляционная схема здесь, это должно быть легко.

Вы могли бы улучшить схему и удалить коллекцию подсобытий встраивая Составные события документов в один события документа

EDIT

/* Event */ 
{ 
    "_id" : "XjhAqqNBkezKY3mdN", 
    "name" : "My event", 
    "userId" : "FiKsAAAgBb7cNoPH7" 
    "subewents" : [{ 
      "_id" : "WkYAqBXNpJryp7rum", 
      "name" : "The subevent", 
      "eventId" : "hQXNzX3jbWppbAYFH" 
     }, { 
      "_id" : "WkYAqBXNpJryp7rum2", 
      "name" : "The subevent2", 
      "eventId" : "hQXNzX3jbWppbAYFH" 
     }, { 
      "_id" : "WkYAqBXNpJryp7rum", 
      "name" : "The subevent", 
      "eventId" : "hQXNzX3jbWppbAYFH" 
     } 
    ] 
} 

/* User */ 
{ 
    "_id" : "RTHh5srhLMQp625zF", 
    "username" : "userx" 
} 
+0

Так, например, я должен извлечь eventIds в массив, а затем использовать этот массив для получения данных subEvent? Если это не так уж сложно, не могли бы вы показать нам образец кода? – Cos

+0

@Cos - см. Мое редактирование с предлагаемой структурой - и не могли бы вы рассказать мне, если это имеет смысл в вашем случае? – profesor79

+0

Спасибо, однако изменение схемы для меня сейчас не вариант, меня все равно будет интересовать построение трех разных вызовов. – Cos

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