我在我的数据库中实现查询结果缓存,发出collection.aggregate(..)
一个查询,$out
运算符作为最后一个阶段。每隔一段时间,会有两个相同的查询尝试同时输出缓存的结果,并且它们会与错误消息冲突,如:
{"message":"$out failed: indexes of target collection dbName.collectionName changed during processing." ... }
当第二个尝试替换集合以开始编写自己的文档时,第一个collection.aggregate(..)
仍在将文档写入集合。
我正在寻找如何避免这个问题的建议。我不知道我是否可以执行$out
有一些选项让它不替换集合,或者我是否可以将它锁定在集合级别而不是在编写文档等中间屈服。
有什么想法吗?
答案 0 :(得分:0)
我无法找到直接避免$out
碰撞的方法。但是,我的团队成员提出了这个解决方案:
这是我所做的代码(使用MongoDB的monk
node.js驱动程序):
function cacheResults( queryName, collection, query ) {
var tempCollectionName = queryName + Math.random();
var outQuery = query.concat( { $out: tempCollectionName } );
return collection.aggregate( outQuery )
.then( () => db.collection( tempCollectionName ) )
.then( cachedCollection => cachedCollection.executeWhenOpened() )
.then( nativeCollection => nativeCollection.rename( queryName, { dropTarget: true } ) )
.then( () => db.collection( queryName ) );