Mongodb 架构设计验证
Mongodb schema design validation
我正在构建一个应用程序,允许用户做一些 "tasks" 来赚取积分。 "tasks" 是 "campaign" 的一部分,而 "campaign" 本身又是 "brands" 的一部分。我对存储用户响应的模式感到困惑。这就是我建造的。所有任务都有一些用户需要完成的活动才能完成任务。
{ _id : ObjectId,
user_id : ObjectId,
campaign : [
{ _id : ObjectId,
campaign_id : ObjectId,
brand_id : ObjectId,
completed : Boolean,
points : Number,
tasks : [
{ _id : ObjectId,
task_id : ObjectId,
start_time : Date,
rewards : points,
responses : [
{ _id : ObjectId,
activity_id : ObjectId,
response : Mixed,
}...]
}...]
}...]
}
查询:
1.插入新的响应并更新多少没有。执行给定任务的活动的人数。
2. 获得用户完成的任务和相应的奖励。
3. 获取用户完成的活动。
4. 更新用户对任务的响应。
5. 找到所有用户对给定 activity.
的唯一响应
问题:
1.The 问题是此架构包含嵌套数组,mongodb 不允许我在级别 1 之后使用位置运算符。
如果有人可以建议可以更好地执行这些查询的设计,那将很有帮助。
编辑:
我把上面的合集拆成了两个合集,方便查询系统,同时保持实体在系统中应有的存在感。
集合 1:user_tasks(存储用户尝试的活动和任务)
{ _id :ObjectId,
user_id : ObjectId,
campaigns : [
{ _id : ObjectId,
campaign_id :ObjectId,
completed : Boolean,
points : Number,
tasks : [ObjectId]
}...]
}
集合 2:user_responses
{ _id : ObjectId,
user_id : ObjectId,
task_id : ObjectId,
rewards : Number,
responses :[
{ _id : ObjectId,
activity_id : ObjectId,
response : Mixed
} ... ]
}
这让我有一个更简单的查询系统,专门用于更新和插入回复以及计算特定任务的排行榜。
我会创建专用于任务和响应的集合。它将 要求您在服务器端编写一些'relational plumbing' 逻辑。这是使用 MongoDB 的代价。一些库提供帮助程序来帮助您完成此操作(例如 Mongoose 的 populate
运算符)。
具有大直径的集合图确实有一些缺点,因为它可能会使您的查询更加复杂并且需要在 MongoDB 客户端和数据库之间进行更多的往返。因此,确实存在使用子文档而不是外国集合的动机。
如何在拥有一个单一的集合和太多的灯光集合之间找到一个中间地带?以下是一些要问自己的问题:
- 我是否有超出文档大小限制的风险?
- 在我的信息模型中,父实体是否应该知道子实体,或者如果没有它们,父实体是否可以存在并有意义?
- 我是否在客户端构建一个完整的 临时 查询/索引引擎只是为了访问子文档?
你必须把你的设计倒过来。基本上使它以任务为中心。
您的数据库中有 4 个主要 collections。
- 用户
- 任务
- 品牌
- 活动
通过这样做,您可以毫无问题地横向扩展,同时,您的数据管理将成为 breeze。
我正在构建一个应用程序,允许用户做一些 "tasks" 来赚取积分。 "tasks" 是 "campaign" 的一部分,而 "campaign" 本身又是 "brands" 的一部分。我对存储用户响应的模式感到困惑。这就是我建造的。所有任务都有一些用户需要完成的活动才能完成任务。
{ _id : ObjectId,
user_id : ObjectId,
campaign : [
{ _id : ObjectId,
campaign_id : ObjectId,
brand_id : ObjectId,
completed : Boolean,
points : Number,
tasks : [
{ _id : ObjectId,
task_id : ObjectId,
start_time : Date,
rewards : points,
responses : [
{ _id : ObjectId,
activity_id : ObjectId,
response : Mixed,
}...]
}...]
}...]
}
查询:
1.插入新的响应并更新多少没有。执行给定任务的活动的人数。
2. 获得用户完成的任务和相应的奖励。
3. 获取用户完成的活动。
4. 更新用户对任务的响应。
5. 找到所有用户对给定 activity.
问题:
1.The 问题是此架构包含嵌套数组,mongodb 不允许我在级别 1 之后使用位置运算符。
如果有人可以建议可以更好地执行这些查询的设计,那将很有帮助。
编辑:
我把上面的合集拆成了两个合集,方便查询系统,同时保持实体在系统中应有的存在感。
集合 1:user_tasks(存储用户尝试的活动和任务)
{ _id :ObjectId,
user_id : ObjectId,
campaigns : [
{ _id : ObjectId,
campaign_id :ObjectId,
completed : Boolean,
points : Number,
tasks : [ObjectId]
}...]
}
集合 2:user_responses
{ _id : ObjectId,
user_id : ObjectId,
task_id : ObjectId,
rewards : Number,
responses :[
{ _id : ObjectId,
activity_id : ObjectId,
response : Mixed
} ... ]
}
这让我有一个更简单的查询系统,专门用于更新和插入回复以及计算特定任务的排行榜。
我会创建专用于任务和响应的集合。它将 要求您在服务器端编写一些'relational plumbing' 逻辑。这是使用 MongoDB 的代价。一些库提供帮助程序来帮助您完成此操作(例如 Mongoose 的 populate
运算符)。
具有大直径的集合图确实有一些缺点,因为它可能会使您的查询更加复杂并且需要在 MongoDB 客户端和数据库之间进行更多的往返。因此,确实存在使用子文档而不是外国集合的动机。
如何在拥有一个单一的集合和太多的灯光集合之间找到一个中间地带?以下是一些要问自己的问题:
- 我是否有超出文档大小限制的风险?
- 在我的信息模型中,父实体是否应该知道子实体,或者如果没有它们,父实体是否可以存在并有意义?
- 我是否在客户端构建一个完整的 临时 查询/索引引擎只是为了访问子文档?
你必须把你的设计倒过来。基本上使它以任务为中心。
您的数据库中有 4 个主要 collections。
- 用户
- 任务
- 品牌
- 活动
通过这样做,您可以毫无问题地横向扩展,同时,您的数据管理将成为 breeze。