我正在使用特定端点构建API,该端点返回整个数据库的各种统计信息。
为此,我有一个聚合管道需要1秒才能完成。
我希望将结果存储在 c 集合中,而不是为每个请求运行此聚合,因为聚合数据很少更改并且经常被访问。
我还将在 c 上定义一些索引,因为我只需要返回传递给端点的某些条件的文档。
当源数据发生变化时,我会再次运行聚合并替换集合 c 的内容。
在MongoDB 3.0中,有关聚合管道的 out 运算符的文档声明:
$ out操作不会更改上一个集合中存在的任何索引
我很困惑,这是否意味着MongoDB在替换内容时不会更新 c 上的索引?
P.S。:我知道MapReduce可能是另一种选择;我先尝试过,但我没有得到我想要的结果;我目前的方法是有效的,并且在接近截止日期之前,我想简单地“缓存”聚合数据,而不是从头开始重新实现。
修改
我要问的是,在更换集合之后索引是否会反映新文档,或者它们是否“陈旧”。
答案 0 :(得分:1)
执行聚合查询时,将更新索引。
您可以按照以下步骤进行测试
{“_ id”:8751,“title”:“宴会”,“作者”:“但丁”,“副本”:2}
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})
现在查找我们添加的新书
MongoDB将保留现有索引
替换现有馆藏
如果$ out操作指定的集合已经存在,那么在聚合完成后,$ out阶段将使用新的结果集合原子地替换现有集合。 $ out操作不会更改先前集合中存在的任何索引。如果聚合失败,$ out操作不会对预先存在的集合进行任何更改。
参考: http://docs.mongodb.org/manual/reference/operator/aggregation/out/