【问题标题】:Many to Many Data modelling in mongodbMongoDB中的多对多数据建模
【发布时间】:2016-04-25 11:17:08
【问题描述】:

建模这种关系的最佳方式是什么?我有一个房间集合和一个用户集合。一个房间可以包含许多用户。一个用户可以属于多个房间。 我正在考虑将房间的用户插入房间集合中的数组(?)中。有没有更好的方法,或者按照我的方式来做这件事完全不正确?

【问题讨论】:

  • 这是一个典型的例子,SQL 比 NoSQL 更好

标签: mongodb document-database database


【解决方案1】:

你的方法是正确的。 MongoDB 不需要架构,因此您可以将来自另一个集合的项目的引用存储在一个集合的一个项目中。

您可以将来自 room 集合的 ObjectId 数组存储在 user 集合中,以识别某人加入了哪些房间。同样,您可以将来自 user 集合的 ObjectId 数组存储在 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' }]
});

【讨论】:

  • 感谢您的回复。如果可以加入特定房间的用户数量没有限制,这是否会成为问题?例如,如果一个房间有 200 个用户,这会导致文档大小显着增加吗?
  • 不会,因为您只存储用户的 ID 而不是用户数据。
【解决方案2】:

它可能看起来像:

{_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 ] }})

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 2014-07-11
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多