MongoDB:在同一个集合上运行$ out的冲突

时间:2017-04-28 17:53:17

标签: mongodb concurrency aggregation-framework

我在我的数据库中实现查询结果缓存,发出collection.aggregate(..)一个查询,$out运算符作为最后一个阶段。每隔一段时间,会有两个相同的查询尝试同时输出缓存的结果,并且它们会与错误消息冲突,如:

{"message":"$out failed: indexes of target collection dbName.collectionName changed during processing." ... }

当第二个尝试替换集合以开始编写自己的文档时,第一个collection.aggregate(..)仍在将文档写入集合。

我正在寻找如何避免这个问题的建议。我不知道我是否可以执行$out有一些选项让它不替换集合,或者我是否可以将它锁定在集合级别而不是在编写文档等中间屈服。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我无法找到直接避免$out碰撞的方法。但是,我的团队成员提出了这个解决方案:

  1. 随机化输出集合的名称,然后一旦写入,
  2. 将集合重命名为所需名称。
  3. 这是我所做的代码(使用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 ) );