【问题标题】:Modeling data on a many-to-many join in Mongo?在 Mongo 中对多对多连接的数据进行建模?
【发布时间】:2012-04-01 00:06:14
【问题描述】:

所以在关系数据库中,我可能有 2 个表,“用户”和“事件”,它们具有多对多关系,因此连接表“用户事件”说。现在,除了 2 个 ID 之外,我还有一些想要存储在此表中的数据,例如一个名为“Enjoyed”的布尔值。

我知道在 Mongo 中,您会在表格之间创建嵌入式链接,例如使用猫鼬

var Person = new Schema({
    email: String,
    events: [EventFeedback]
})

var Event = new Schema({ ... });

var EventFeedback = new Schema({
    person: Schema.ObjectId,
    event: Schema.ObjectId,
    enjoyed: Boolean
});

但这真的是最好的建模方式吗?我会认为 EventFeedback 中的所有内容都可以在 Person.events 中,它会被 Event._id 索引?或者这只是 Mongoose 的一个限制?

【问题讨论】:

  • 老实说,如果您发现自己需要联接,我只会使用关系数据库。
  • 实际上,我认为我需要的是Embedded Documents,它有点像模型,但主要用于定义数组内容的结构。我只是担心如何通过事件 ID(或任何外部 ID)查看这些嵌入式文档之一......?

标签: mongodb database-design mongoose database


【解决方案1】:

试试这个方法

var EventScheme = new Schema({ ... });  
mongoose.model('Event', EventScheme);

var PersonScheme = new Schema({
  email: String,
  events: [{
    event: {
      type: mongoose.Schema.ObjectId,
      ref: 'Event'
    },
    enjoyed: Boolean
  }]
});

【讨论】:

    【解决方案2】:

    最好使用嵌入式文档而不是链接。

    var Person = { 
       email: "joe.user@users.mongodb.org",
       events: [ 
            {code: "MONGONY2012", name: "Mongo NY", date: "5/23/2012", link: "http://www.10gen.com/events/mongo-nyc", enjoyed: true}, 
            {code: "MONGOPHL2012", name: "Mongo Philly", date: "4/9/2012", link: "http://www.10gen.com/events/mongodb-philly", enjoyed: true}
       ]
    }
    

    您可以使用点符号轻松查询 Mongo 的事件:

    db.people.find({"events.code": "MONGONY2012"})

    【讨论】:

    • 我认为这是一个问题。大概你会有很多事件和很多人。您要为每个人重复事件代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多