Разработка базы данных Mongodb - PullRequest
1 голос
/ 12 января 2012

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

Users -> _id, name, friendList
Activity -> _id, description, date, involvedUsers

Так, пример документабудет:

"User theo": 1, theo, array(mike, rutger, tijmen)
"User mike": 2, mike, array(theo, rutger, tijmen)

Activity x: 1, 'having fun with friends', {{todaydatetime}}, array(1, 2)
Activity y: 2, 'going out', {{saturdaydatetime}}, array(1, 2)

Так что теперь, если "Тео" входит в систему, он должен получить, что Майк "будет веселиться с друзьями" так же, если Майк входит в систему.

И еслив качестве даты они выбирают субботу, Майк получит, что Тео уходит, а Тео получит активность, которую уходит Майк.

Как я могу это сделать, я знаю, что в MySql довольно просто с объединениями и т.но как я могу получить все действия пользователей в «списке друзей» и отфильтровать их по определенной дате, например, предоставьте мне все действия, которые происходят в субботу.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Вы, вероятно, хотите что-то вроде (это полностью не проверено), а остальные правы: если у вас слишком много массивов (тысяч) для ваших списков друзей и участников, это, вероятно, вызовет проблемы с масштабированием:

collection users:
{
  _id: objid, 
  name: "theo", 
  friends: [objid, objid, objid] /* these are user object ids */
}

collection activities:
{
  _id: objid, 
  desc: "having fun with friends", 
  date: new Date(), 
  involved: [objid, objid, objid] /* these are user object ids */
}

Я бы сделал так, чтобы обеспечить индекс на дату и участие.Смотрите здесь для получения дополнительной информации о индексировании значений массива: http://www.mongodb.org/display/DOCS/Multikeys

db.activities.ensureIndex({date:1});
db.activities.ensureIndex({involved:1});

Таким образом, чтобы выбрать пользователей, вовлеченных в действие, которое вы будете выполнять (из оболочки):

var start_date = new Date(2012, 1, 14);
var end_date = new Date(2012, 1, 15);
var friends = db.users.findOne(_id: objid for user).friends;
var activities = db.activities.find(
   {
     date: {$gte : start_date},
     date: {$lte : end_date},
     involved : {$in : friends}
   });
0 голосов
/ 12 января 2012

Если вам нужно использовать MongoDB (что неплохой выбор), вам придется читать документы.

Для этой конкретной ситуации вас интересует поиск по массиву:

http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

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