Каков наилучший способ моделирования таких отношений? У меня есть коллекция комнат и коллекция пользователей. Комната может содержать много пользователей. Пользователь может принадлежать многим комнатам. Я думал о том, чтобы вставить пользователей комнаты в массив (?) В коллекцию комнат. Есть ли лучший способ или это вообще неправильно делать так, как я это делаю?
Моделирование данных «многие ко многим» в mongodb
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
Спасибо за ответ. Будет ли это проблемой, если нет ограничений на количество пользователей, которые могут присоединиться к определенной комнате? Например, если в комнате 200 пользователей, приведет ли это к значительному увеличению размера документа?
- person Ying Yangz; 19.01.2016
Этого не произойдет, потому что вы храните только идентификаторы пользователей, а не пользовательские данные.
- 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