临时表异常 - e11000 重复键错误

Posted

技术标签:

【中文标题】临时表异常 - e11000 重复键错误【英文标题】:Exception on temporary table - e11000 duplicate key error 【发布时间】:2021-05-06 00:27:43 【问题描述】:

致敬!长期阅读,第一次提问。希望我能清楚地提出问题。

我遇到了一些我无法理解 MongoDB 操作的行为。

当访问我们的一个端点时,我们最初遇到的问题是多次 MongoDB 异常警报。

命令聚合失败:插入 $out 失败: lastOp: ts: Timestamp(1612204536, 11872), t: 45 , connectionId: 101263, err: "E11000 duplicate key error collection: qt.tmp.agg_out. 7907 索引:id 复制密钥::“jLCJp53””,代码:11000,代码名称:“DuplicateKey”,n:0,ok:1.0,操作时间:时间戳(1612204536,11872),$ clusterTime: clusterTime: Timestamp(1612204536, 11873), 签名: hash: BinData(0, 0000000000000000000000000000000000000000), keyId: 0 .

查看端点,它调用一个方法来获取请求集合,就像这样。我相信这个代码块中的 $out 会抛出异常:

        public IEnumerable<Request> GetRequests(string courseId, string quizId = "", string questionId = "")
    
        string tempColName = "tempQTCol-GetRequests-" + DateTime.Now.ToString("MMddyyyyhhmmssfff") + "-" + courseId + "-" + H.GenerateUniqueId();
        var requests = GetCollection<Request>(CollectionName).Aggregate(new AggregateArgs
        
            Pipeline = new[] 
               BsonDocument.Parse(" $match:    $and: [ \"CourseId\": \"" + courseId
            + "\" ,  \"QuizId\": /.*" + quizId + ".*/i ,  \"QuestionId\": /.*" + questionId + ".*/i]  "),
               BsonDocument.Parse(" $out : \""+tempColName+"\" ")
            
        ).Select(s => BsonSerializer.Deserialize<Request>(s)).ToList();
        DropCollection(tempColName);
        return requests;
    

我不知道这是否是有用的信息,但因此,由于错误是在 DropCollection 之前引发的,我相信临时集合正在我们的数据库上创建并且永远不会被丢弃。

temporary database creation

在应用程序洞察中,有日志记录尝试发布到端点,它会抛出一个 500 错误,并带有我在上面发布的 MongoDB 异常。

提前感谢您的时间和考虑。我对 mongo 不是很熟悉,但我会尽力提供任何需要的信息。

【问题讨论】:

【参考方案1】:

您有 id dup 键: : "jLCJp53" " ,您可能需要在每次插入文档之前删除临时集合,或者您需要允许自动生成 _id 键(默认情况下自动生成每个进程生成的 mongodb _id 键是唯一的)

【讨论】:

以上是关于临时表异常 - e11000 重复键错误的主要内容,如果未能解决你的问题,请参考以下文章

临时表不会删除[重复]

ORA-1652:临时表空间异常优化处理

MySQL创建临时表-旧表建新表

MongoError:E11000 重复键错误集合:annka.transactions 索引:assets_1 重复键::null

MongoError: E11000 重复键错误索引

插入期间:E11000 重复键错误索引