下面的示例显示了两个可能的文档结构,用于MongoDB 3.4上联系人集合中的联系人。请注意联系人与其所属广告系列之间的关系。
方法A:广告系列是一个对象,它将广告系列保存为键:值对,其中键是广告系列ID和价值其他广告系列数据。
{
"first_name": "John",
"last_name": "Doe",
"user_id": 1170,
"campaigns": {
3452: {
subscription_dt: ISODate("2017-01-28T19:00:00Z"),
score: 19
},
243: {
subscription_dt: ISODate("2017-01-15T16:45:00Z"),
score: 27
}
}
}
方法B:广告系列是一个只将广告系列作为对象保存的数组。
{
"first_name": "John",
"last_name": "Doe",
"user_id": 1170,
"campaigns": [
{
campaign_id: 3452,
subscription_dt: ISODate("2017-01-28T19:00:00Z"),
score: 19
},
{
campaign_id: 243,
subscription_dt: ISODate("2017-01-15T16:45:00Z"),
score: 27
}
]
}
请想象一下集合上的任何类型的查询:
PD:为了分析的目的,请假设关系必须放在联系文件中。我建议你不要浪费时间回复其他设计方案。
先谢谢
答案 0 :(得分:1)
我会选择方法B,这是常用的。这是查询在广告系列数组中获取数据的好方法。
您可以在campaign_id上创建索引并使用它来获得更好的查询效果。此外,您还可以使用user_id和campaign_id(复合)创建一个多键索引作为问题的答案。多键索引的缺点是多键索引需要比其他索引更多的存储。但它可以让您从具有高性能的数组中进行查询。
在方法A中,要使用campaign_id查询数据,您必须为每个campaign_id创建索引,这是无意义的(我不确定是否有人使用该方法,但我不会这样做)。新的campaign_id将强制您使用新的campaign_id创建新索引,以便在查询中获得更好的效果。对于方法A,可能会给出更好的答案,但我在MongoDB上的经验告诉我选择方法B来解决这个问题。