2012-01-12 4 views
1

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

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) 

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

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

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

+0

Итак, почему вы хотите использовать MongoDB? Используйте MySQL, вы знаете, как это сделать. –

+1

Это не мой вопрос, я должен использовать MongoDb. – randomKek

+0

Могу я спросить, почему вы должны? –

ответ

2

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

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 */ 
} 

Я бы ensureIndex на дату и участии. Смотрите здесь для получения дополнительной информации о значениях массива индексации: 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

Я понимаю о другом списке, но мне просто нужен MongoDb также из-за функциональности и производительности геокодирования в mongodb. Что бы вы посоветовали мне MySql? – randomKek

+0

Я бы, вероятно, использовал mongodb в любом случае. Если вам нужно использовать другую схему для поддержки большего количества друзей или более вовлеченных, то вы можете разбить ее на разные коллекции, однако для получения ваших ответов потребуется больше поисков. –

+0

не должно быть '$ lt' в выборе даты, чтобы получить только один день (в противном случае из того, что, как я понимаю, выбирается на следующий день, тоже)? –

0

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

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

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

+0

Но как бы я структурировал свои документы? – randomKek

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