C# MongoDB.Driver.GridFS.Delete上的MongoDB createIndexes异常
我使用的是C#MongoDB.Driver,版本=1.10.1.73 请注意,我知道的不是我的问题 错误消息: MongoDB.Driver.MongoWriteConcernException:命令'createIndexes' 失败:异常:名称为:filename\u 1\u uploadDate\u 1的索引已存在 存在不同的选项(响应:{ “createdCollectionAutomatically”:false,“numIndexesBefore”:4, “errmsg”:“异常:名称为:filename\u 1\u uploadDate\u 1的索引” 已存在不同的选项,“代码”:85,“确定”:0.0}) 完整堆栈跟踪: MongoDB.Driver.MongoCollection.CreateIndex(IMongoIndexKeys, IMongoIndexOptions选项)C# MongoDB.Driver.GridFS.Delete上的MongoDB createIndexes异常,c#,mongodb,mongodb-query,mongodb-.net-driver,C#,Mongodb,Mongodb Query,Mongodb .net Driver,我使用的是C#MongoDB.Driver,版本=1.10.1.73 请注意,我知道的不是我的问题 错误消息: MongoDB.Driver.MongoWriteConcernException:命令'createIndexes' 失败:异常:名称为:filename\u 1\u uploadDate\u 1的索引已存在 存在不同的选项(响应:{ “createdCollectionAutomatically”:false,“numIndexesBefore”:4, “errmsg”:“异常:名
MongoDB.Driver.MongoCollection.CreateIndex(IMongoIndexKeys)
MongoDB.Driver.MongoCollection.CreateIndex(字符串[]键名)
MongoDB.Driver.GridFS.MongoGridFS.ensureIndex(Int32 maxFiles)
MongoDB.Driver.GridFS.MongoGridFS.ensureIndex()
MongoDB.Driver.GridFS.MongoGridFSFileInfo.Delete()
默认情况下,会在我的Mongo服务器3.0.7版上创建
filename\u 1\u uploadDate\u 1
索引。唯一的默认设置为“非唯一”。每当某段代码强制此索引是唯一的(我认为它应该是唯一的),在从Mongo删除时就会发生上述异常
解决方案:如果索引不存在,则创建它,如果存在且唯一,则重新创建为非唯一
CommandResult cr = null;
IndexOptionsDocument NotUnique = new IndexOptionsDocument("unique", false);
IndexKeysDocument fileNameUploadDateIdx = new IndexKeysDocument(
new List<BsonElement> {
new BsonElement(ColumnFilename, 1),
new BsonElement(ColumnUploadDate, 1) });
var index = indexes.FirstOrDefault(
i => i.Key.Equals(fileNameUploadDateIdx.ToBsonDocument()));
if (index == null)
{
cr = files.CreateIndex(fileNameUploadDateIdx, NotUnique);
if (!cr.Ok) {
//Cannot create uploadDate index
}
}
else if (index.IsUnique)
{
cr = files.DropIndexByName(index.Name);
if (!cr.Ok) {
// Cannot drop index filename_1_uploadDate_1.
}
else
{
cr = files.CreateIndex(fileNameUploadDateIdx, NotUnique);
if (!cr.Ok) {
//Cannot create uploadDate index
}
}
}
CommandResult cr=null;
IndexOptions Document NotUnique=新的IndexOptions文档(“唯一”,false);
IndexKeysDocument文件名UploadDateIDX=新IndexKeysDocument(
新列表{
新的BsonElement(ColumnFilename,1),
新的BSoneElement(ColumnUploadDate,1)});
var index=index.FirstOrDefault(
i=>i.Key.Equals(fileNameUploadDateIdx.ToBsonDocument());
如果(索引==null)
{
cr=files.CreateIndex(fileNameUploadDateIdx,NotUnique);
如果(!cr.Ok){
//无法创建上载日期索引
}
}
else if(index.IsUnique)
{
cr=files.DropIndexByName(index.Name);
如果(!cr.Ok){
//无法删除索引文件名\u 1\u上载日期\u 1。
}
其他的
{
cr=files.CreateIndex(fileNameUploadDateIdx,NotUnique);
如果(!cr.Ok){
//无法创建上载日期索引
}
}
}
根据我们的观点,如果不删除并重新创建索引,就无法修改索引上的选项。也解决了这一问题,并提供了一种扩展方法来包装此拖放并从头开始重新创建行为。我看不出此错误与此代码有何关系。哪一行实际抛出异常?堆栈跟踪和行抛出异常都在问题中标记…对于数据已经在其中的集合,这可能非常昂贵。
CommandResult cr = null;
IndexOptionsDocument NotUnique = new IndexOptionsDocument("unique", false);
IndexKeysDocument fileNameUploadDateIdx = new IndexKeysDocument(
new List<BsonElement> {
new BsonElement(ColumnFilename, 1),
new BsonElement(ColumnUploadDate, 1) });
var index = indexes.FirstOrDefault(
i => i.Key.Equals(fileNameUploadDateIdx.ToBsonDocument()));
if (index == null)
{
cr = files.CreateIndex(fileNameUploadDateIdx, NotUnique);
if (!cr.Ok) {
//Cannot create uploadDate index
}
}
else if (index.IsUnique)
{
cr = files.DropIndexByName(index.Name);
if (!cr.Ok) {
// Cannot drop index filename_1_uploadDate_1.
}
else
{
cr = files.CreateIndex(fileNameUploadDateIdx, NotUnique);
if (!cr.Ok) {
//Cannot create uploadDate index
}
}
}