为这个冗长的问题道歉,但我只是想通过自己的研究来尝试自己解决这个问题。
我的第一个stackoverflow问题......在这里......
我的流星应用程序很好地插入,直到我想要一个排名表。这篇30 years of basketball standings文章很鼓舞人心。我想利用Mongo提供的那种力量和灵活性,并跟踪我在Mongo上购买这本书的团队和玩家积分(强烈推荐)。我有多个系列和一个名为“游戏”的系列,可以跟踪游戏和每场比赛的得分。这是同一份文件:
{
"leagueId" : "6RtH74QbxGG7xbZXh",
"regionId" : "KDbqfAoKDx2iDDXSS",
"seasonId" : "b5HkGcWFNenpGGvCd",
"gameTime" : "15:00",
"gameDate" : "11/23/2014",
"gameNumber" : 4,
"gameStatus" : "played",
"homeTeam" : "MYBw2RiNwrBhfh9W8",
"homeTeamScore" : 4,
"awayTeam" : "fwx79JJFob5XbaAx6",
"awayTeamScore" : 2,
"gameType" : "regular_season",
"userId" : "4MKaZK84AdZ8j3xr2",
"author" : "league",
"submitted" : "Wed Dec 10 2014 09:51:48 GMT-0800 (PST)",
"_id" : "Gwsu6X6DXXzavdqZQ"
}
我确定了聚合框架是可行的方法但是在深入研究之后我发现Meteor在mongo聚合框架中存在一些客户端限制(stackoverflow.com/questions/11266977/are-group-by-aggregation-queries - 可能合流星尚未)。
我还想过[在阅读这样的文章后对我的文档结构进行非规范化] [4]。在阅读了Discover Meteor的Denormalization章节(好书!)之后,似乎没有非规范化给了我更大的灵活性,但我可以在Meteor / Mongo中进行非规范化以及其他好处。前面提到的NBA文章非常规范化,不确定我是否可以使用Meteor / Mongo复制该结构。
然后我跳进了Aggregate兔洞,发现了一些不错的读物(stackoverflow.com/questions/18520567/average-aggregation-queries-in-meteor/18884223#18884223 - 我用我的数据尝试了这个,我看到了输出在服务器上,但是当我在铁路由器中添加订阅'waiton'时,没有错误,它只是挂起。所以它在服务器上工作,而不是客户端?)。
I then found this article which looked very promising。这导致我进入大气包([meteorhacks:aggregate] [8] ......它的依赖性)但文章似乎更多地针对mongo的专家,因为我无法获得我的数据客户端。
从我的所有阅读中我猜测我应该在我的'collections'文件夹中创建一个新的集合(在客户端和服务器上可用),然后我使用我的聚合代码发布该集合($ group和$ match和很酷的东西,比如$和)。然后我真的不确定接下来该做什么。我是否创建了一个服务器方法并从我的客户端代码调用该方法(尝试过并且无法使其工作)?我应该订阅铁路由器中的集合(每次我都这样,我的应用程序只是挂起而没有错误)?
如果有人知道如何使用聚合物与流星,我会非常感谢一些/任何指导。我想在获得胜利,亏损和平局之前,我只需要更多的信息,然后我才能获得更多信息。
注意:我绕道而行,并认为MapReduce可能是解决方案(thebhwgroup.com/blog/2014/09/bi-nodejs-couchdb-mapreduce),但我也无法在Meteor中使用它。
答案 0 :(得分:0)
您提出了许多主题,并且可能有很多解决方案可以满足您的需求。一个关键点是,您目前无法在Meteor的客户端运行mongo聚合。因此,任何将游戏数据聚合到排名中的方法都需要首先聚合游戏数据服务器端,然后才将cursor
结果发布给客户端。
为了将您的问题分解为更易于管理的简单,我将首先专注于在服务器端组装一个看起来像您想要的聚合。您将需要一个包,如您提到的meteorhacks:aggregate
或其他完成相同目的的包。
然后,对于初学者,您应该只在Meteor.startup
上运行聚合管道服务器端几次,直到它看起来像您想要的那样。要快速查看它,您可以将其保存到变量并将其记录在控制台中(同样,在服务器端)。或者,您可以将其保存到新的Collection
,例如Standings
,并使用控制台中的meteor mongo
进行检查。部分问题在于,当您仍在考虑如何设置集合时,您可能会先尝试使用Iron Router发布和订阅您的集合。
这是下一点。一旦聚合文档在服务器上显示您想要的方式,您就需要决定是否要在每次聚合一组新的标记时保存结果,或者每次发布时都要动态组合它们。在您链接的Owens文章中,他直接在发布函数内聚合数据。这意味着每次发布或订阅时都会重新运行,这可能非常快或非常慢,具体取决于数据的大小和复杂程度。同样重要的是要考虑到,在这种模式下,您实际上并没有向客户发布一系列排名 - 您正在发布变异的游戏集合。如果您希望您的排名获得自己的属性,随时间变化,或者您希望历史性地轮询它们,您最好创建一个新的Collection
,例如Standings
并在集合中插入新的标记每次收到新游戏结果时。
您的发布功能可能非常简单,例如Standings.find({}, {limit: 1})
,其中包含对最新信息的查询。您可以按照建议订阅Iron Router的waitOn
。
要在Standings集合中插入新条目,每次引入新游戏时,都可以调用Meteor.Call("createStandings")
之类的服务器端方法。这可能导致一个大文档随着时间的推移,如果你不关心维护历史记录,你可以剔除甚至写下来。
同样,有很多方法可以解决这个问题。希望这可以帮助。