【发布时间】: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 之前引发的,我相信临时集合正在我们的数据库上创建并且永远不会被丢弃。
在应用程序洞察中,有日志记录尝试发布到端点,它会抛出一个 500 错误,并带有我在上面发布的 MongoDB 异常。
提前感谢您的时间和考虑。我对 mongo 不是很熟悉,但我会尽力提供任何需要的信息。
【问题讨论】: