【发布时间】:2015-04-07 12:22:14
【问题描述】:
假设您有嵌套集合a、b 和c,它们遵循以下映射:
{"collection":"a",
"children":[{"collection":"b",
"name":"bee",
"children"[{"collection":"c","name":"cee"}]}]}
这里是a1,从带有$http的MongoDb数据库中获取:
{"title":"title a1",
"id":"a1",
"bee":[{"id":"b1"},{"id":"b2"}],
"other_array":[{"foo":"bar"},{"foo":"baz"}]}
现在,在 bee 数组中,我们只有引用 (id)。我们想要的是继续跟随地图更新a1,并将引用替换为实际数据。
这将需要从数据库中获取 b1 和 b2 数据,它们可能都有 cee 数组,我们需要从 c 集合中获取它们的元素。
我想可以很容易地创建一个专用的后端函数,它会接收a1,一次完成所有的获取并返回最终结果;
但是如何通过多次调用 $http/$resource 来获得 a1 的完整详细版本?
是否应该使用递归函数?
或者最好使用 $q 和链式承诺?
如何遍历地图(知道哪些集合是相关的,以及它们的名称是什么),检索相关的b 项目,然后是相关的c 项目,最后更新a1,所以至于用类似的东西替换a1:
{"title":"title a1","id":"a1","bee":[{"id":"b1","title":"title b1","other_stuff":"blah blah","cee":[{"id":"c1","title":"title c1","c_specific":"hi there"}]},{"id":"b2","title":"title b2","other_stuff":null,"cee":[]}],"other_array":[{"foo":"bar"},{"foo":"baz"}]}
【问题讨论】:
-
第一件事:不要这样做,多次 http 调用来获取您需要的单个值会减慢您网站的响应时间并提供糟糕的用户体验 -我强烈建议你不要在客户端解决它。
-
也就是说,您可以通过承诺和递归很容易地解决这个问题 - 我认为您不会获得合理的性能,但它肯定是可能的。你的函数调用看起来如何?
-
好的,谢谢,那么您是否建议我在后端构建一个专用函数,该函数将对“a”文档及其所有后代进行数据库调用,并将文档返回为 angular?
-
是的。或者更好 - 只需将相关位存储在 Mongo 中的单个实体中。
-
好的,谢谢本杰明的建议。由于我是 StackOverflow 的新手,我不知道该怎么做:如果你回答了这个问题,我可以验证它;如果您不想打扰,我可以回答它,从而关闭主题。你建议我做什么?
标签: angularjs recursion promise chaining subdocument