Mongodb聚合框架输出集合索引

时间:2015-09-20 14:23:32

标签: mongodb aggregation-framework

我正在使用特定端点构建API,该端点返回整个数据库的各种统计信息。

为此,我有一个聚合管道需要1秒才能完成。

我希望将结果存储在 c 集合中,而不是为每个请求运行此聚合,因为聚合数据很少更改并且经常被访问。

我还将在 c 上定义一些索引,因为我只需要返回传递给端点的某些条件的文档。

当源数据发生变化时,我会再次运行聚合并替换集合 c 的内容。

在MongoDB 3.0中,有关聚合管道的 out 运算符的文档声明:

  

$ out操作不会更改上一个集合中存在的任何索引

我很困惑,这是否意味着MongoDB在替换内容时不会更新 c 上的索引?

P.S。:我知道MapReduce可能是另一种选择;我先尝试过,但我没有得到我想要的结果;我目前的方法是有效的,并且在接近截止日期之前,我想简单地“缓存”聚合数据,而不是从头开始重新实现。

修改

我要问的是,在更换集合之后索引是否会反映新文档,或者它们是否“陈旧”。

1 个答案:

答案 0 :(得分:1)

执行聚合查询时,将更新索引。

  • $ out将在您的汇总查询成功时创建一个集合
  • 当您再次执行聚合时,Mongo将更新由$ out创建的集合
  • 更新集合后,与集合关联的索引也会更新

您可以按照以下步骤进行测试

  • 创建一个较小的集合,说'books'

{“_ id”:8751,“title”:“宴会”,“作者”:“但丁”,“副本”:2}

  • 让您的汇总与输出集合 - Step2

db.books.aggregate([{$ group:{_ id:“$ author”,books:{$ push:“$ title”}}},{$ out:“authors”}])

  • 在新集合作者的书籍上创建索引

db.authors.createIndex({书:1})

  • 查询您的作者集合

db.authors.find({books:'The Banquet'})。explain() 并寻找获奖计划   - 添加另一条记录

db.books.insert({“_ id”:7101,“title”:“Wings of Fire”,“作者”:“APJ Abdul Kalam”,“副本”:1})

  • 执行step2
  • 上给出的聚合查询

现在查找我们添加的新书

  • db.authors.find({books:'Wings of Fire'})。explain()

你可以发现Winning计划让IXSCAN说索引用于此搜索,因此Mongo会为新记录更新索引。

MongoDB将保留现有索引

替换现有馆藏

如果$ out操作指定的集合已经存在,那么在聚合完成后,$ out阶段将使用新的结果集合原子地替换现有集合。 $ out操作不会更改先前集合中存在的任何索引。如果聚合失败,$ out操作不会对预先存在的集合进行任何更改。

参考: http://docs.mongodb.org/manual/reference/operator/aggregation/out/