让我们说我有一个Todos应用程序,有两个新的"高级"特性:
在我们的高级Todos应用中,有一个包含2列的视图 - 每列代表一个"标签" (我们会说" Bug"和"故事")。
每列显示与列标签匹配的所有待办事项。为此,我们订阅了列标签中传递的每一列和一个限制(我们说10)以启用无限滚动。
服务器沿着以下行返回光标:
// Return all Todos matching passed label that are "Top-level"
// Todos (e.g. they are a parent, not a child).
// The "todo.parent" field is the string _id of another todo.
return Todos.find({ labels: label, parent: { $exists: false } }, { limit });
在滚动底部,我们增加限制并更新订阅。
这很好用,非常简单。很酷!
我们现在有一个要求,我们想要展示" Child"如果列中的父级不,则在列中进行待办事项。例如,如果我们有2个Todos:
todo1 = {
title: "Re-style login screen",
labels: ["Story"]
};
todo2 = {
title: "Fix email validation",
labels: ["Bug"],
parent: todo1._id
};
然后我们想要"故事"列显示todo1和" Bug"列显示todo2。
为了达到这个目的,根据我们当前的数据模型,我们希望服务器只返回"顶级"的Todos,它们现在由以下条件定义:
Todos不是儿童&& Todos的父母与列标签不匹配
因此服务器发布(使用Publish Composite)如下所示:
return {
find() {
return Todos.find({ labels: label },{ limit });
},
children: [
{
find(childTodo) {
if (childTodo.parent) {
return Todos.find({ _id: childTodo.parent });
}
},
},
],
};
注意:我们在本出版物中返回todo.parent doc,以便在客户端上我们不会在列中显示子Todo(如果父级在同一列中)。这是由我们的"限制"引起的问题。在父母面前返回孩子。
此解决方案在大多数情况下都可以正常工作......
我们开始遇到问题,当出版物返回9个孩子Todos(我们说标签" Bug")和1个父Todo(也标签" Bug" )。这意味着在我们的" Bug"列,只显示1个项目(父项)。
1 Todo显示与我们从服务器预期的限制不符。
我们可以等待订阅准备就绪,检查我们选择呈现的金额是否与我们的"真实"限制,然后增加限制,如果它没有。但在这一点上,对于我们的目标,整个事情似乎过于复杂。
您可以在这里想到更好的发布/订阅模型来解决此问题吗?是否对数据模型进行了调整,可以在不需要大量增加数据库写入的情况下提高复杂性?