作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
根据 createIndexes
command 上的文档:
If you create an index with one set of options and then issue createIndexes with the same index fields but different options, MongoDB will not change the options nor rebuild the index.
解决方案是删除索引并从头开始创建它,但成本很高。
有没有办法在没有索引的情况下创建索引,如果有具有相同选项的索引则什么也不做,如果选项发生变化则替换索引?
这个问题最初是由 Phil Barresi 提出的here但已被删除。
最佳答案
查看 driver我已经实现了一个 CreateOrUpdateIndex
扩展方法,它比较原始索引文档,如果索引选项已更改,则索引将被替换(只要索引名称保持不变):
public static WriteConcernResult CreateOrUpdateIndex(
this MongoCollection mongoCollection,
IMongoIndexKeys keys,
IMongoIndexOptions options = null)
{
if (mongoCollection.IndexExists(keys))
{
var indexDocument = mongoCollection.GenerateIndexDocument(keys, options);
if (!mongoCollection.GetIndexes().RawDocuments.Any(indexDocument.Equals))
{
mongoCollection.DropIndex(keys);
}
}
return mongoCollection.CreateIndex(keys, options);
}
生成原始索引文档:
public static BsonDocument GenerateIndexDocument(this MongoCollection mongoCollection, IMongoIndexKeys keys, IMongoIndexOptions options)
{
var optionsDocument = options.ToBsonDocument();
var keysDocument = keys.ToBsonDocument();
var indexDocument = new BsonDocument
{
{ "ns", mongoCollection.FullName },
{ "name", GenerateIndexName(keysDocument, optionsDocument) },
{ "key", keysDocument }
};
if (optionsDocument != null)
{
indexDocument.Merge(optionsDocument);
}
return indexDocument;
}
public static string GenerateIndexName(IEnumerable<BsonElement> keys, BsonDocument options)
{
const string name = "name";
if (options != null && options.Contains(name)) return options[name].AsString;
return string.Join("_", keys.Select(element =>
{
var value = "x";
switch (element.Value.BsonType)
{
case BsonType.Int32: value = ((BsonInt32)element.Value).Value.ToString(); break;
case BsonType.Int64: value = ((BsonInt64)element.Value).Value.ToString(); break;
case BsonType.Double: value = ((BsonDouble)element.Value).Value.ToString(); break;
case BsonType.String: value = ((BsonString)element.Value).Value; break;
}
return string.Format("{0}_{1}", element.Name, value.Replace(' ', '_'));
}));
}
关于c# - 有没有办法创建或更新 MongoDB 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24850696/
我是一名优秀的程序员,十分优秀!