Моделирование данных «многие ко многим» в mongodb

Каков наилучший способ моделирования таких отношений? У меня есть коллекция комнат и коллекция пользователей. Комната может содержать много пользователей. Пользователь может принадлежать многим комнатам. Я думал о том, чтобы вставить пользователей комнаты в массив (?) В коллекцию комнат. Есть ли лучший способ или это вообще неправильно делать так, как я это делаю?


person Ying Yangz    schedule 19.01.2016    source источник
comment
это типичный случай, когда SQL будет лучшим инструментом, чем NoSQL.   -  person Eric    schedule 19.01.2016


Ответы (2)


Ваш подход правильный. MongoDB не требует схемы, поэтому вы можете хранить ссылки на элементы из другой коллекции в элементе одной коллекции.

Вы можете сохранить массив ObjectIds из коллекции room в коллекции user, чтобы определить, к каким комнатам присоединился человек. Точно так же вы можете сохранить массив ObjectIds из коллекции user в коллекции room, чтобы определить, какие пользователи присоединились к комнате.

Ваши схемы будут выглядеть примерно так:

var UserSchema = new Schema({
  'name': String,
  rooms: [{ type: Schema.Types.ObjectId, ref: 'RoomSchema' }]
});

var RoomSchema = new Schema({
  'name': String,
  'users': [{ type: Schema.Types.ObjectId, ref: 'UserSchema' }]
});
person gnerkus    schedule 19.01.2016
comment
Спасибо за ответ. Будет ли это проблемой, если нет ограничений на количество пользователей, которые могут присоединиться к определенной комнате? Например, если в комнате 200 пользователей, приведет ли это к значительному увеличению размера документа? - person Ying Yangz; 19.01.2016
comment
Этого не произойдет, потому что вы храните только идентификаторы пользователей, а не пользовательские данные. - person gnerkus; 20.01.2016

Это может выглядеть так:

{_id:"123", "type":"room", "users":[ 111, 222]}
{_id:"111", "type":"user", "room": [ 123, 456]}

Пример добавления пользователя в комнату:

db.test.update( { _id: "123" }, { $addToSet: {"users": 333 } } )

Пример удаления пользователя из комнаты:

db.test.update( { _id: "123" }, { $pullAll: { scores: [ 111, 222 ] }})
person alex10    schedule 20.01.2016