- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
管理索引
管理索引
- Mongo Shell
在本页面
此页显示如何管理现有索引。有关创建索引的说明,请参阅特定索引类型页。
查看现有索引
以下部分提供了查看集合或整个数据库上现有索引的方法。
列出集合上的所有索引
要返回一个集合上所有索引的列表,使用db. collections . getindexes ()
方法或类似的驱动程序的方法。
例如,要查看people
集合上的所有索引,运行以下命令:
db.people.getIndexes()
列出数据库的所有索引
在mongo
shell中,可以使用以下操作列出数据库中所有的集合索引:
db.getCollectionNames().forEach(function(collection) {
indexes = db[collection].getIndexes();
print("Indexes for " + collection + ":");
printjson(indexes);
});
从3.0版本开始,MongoDB不再支持对系统的直接访问。索引集合,以前用于列出数据库中的所有索引。
列出特定类型的索引
列出所有索引的类型(例如散列,文本)集合在所有数据库,您可以使用以下操作在mongo
shell:
// The following finds all hashed indexes
db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(idx){
let idxValues = Object.values(Object.assign({}, idx.key));
if (idxValues.includes("hashed")) {
print("Hashed index: " + idx.name + " on " + idx.ns);
printjson(idx);
};
});
});
});
删除索引
MongoDB提供了两种方法从集合中删除索引:
删除特定的指数
要删除一个索引,使用db.collection.dropIndex()
方法。
例如,下面的操作删除了 accounts 集合中的 tax-id 字段的升序索引:
db.accounts.dropIndex( { "tax-id": 1 } )
该操作返回一个文档,其中显示了该操作的状态:
{ "nIndexesWas" : 3, "ok" : 1 }
其中nIndexesWas
的值反映了在删除这个索引之前的索引数量。
对于文本索引,将索引名称传递给 db.collection.dropIndex()
方法。有关详细信息,请参见使用索引名称删除文本索引。
注意
从MongoDB 4.2开始,' db.collection.dropIndexes() '可以接受一个索引名称数组。
删除所有索引
你也可以使用db. collections . dropindexes ()
从一个集合中删除_id索引之外的所有索引。
例如,下面的命令从 accounts 集合中删除所有索引:
db.accounts.dropIndexes()
这些shell助手提供了dropIndexes 数据库命令
的包装器。您的客户端库可能有一个不同的或额外的接口用于这些操作。
修改索引
要修改现有索引,您需要删除并重新创建索引。TTL索引是该规则的例外 ,可以通过collMod
命令与index
收集标志一起 对其进行修改。
在分片中查找不一致的索引
如果分片集合在每个包含该分片块的分片上没有完全相同的索引(包括索引选项),则该集合具有不一致的索引。虽然在正常操作中不应该出现索引不一致的情况,但也会出现索引不一致的情况,例如:
- 当用户创建具有
unique
键约束的索引并且一个分片包含具有重复文档的块时。在这种情况下,创建索引操作可能会在没有重复的分片上成功,但在没有重复的分片上不会成功。 - 当用户创建一个索引碎片在对面(滚动的方式(即手动构建跨多个碎片索引一个接一个地)但是无论未能构建相关碎片或是不正确的索引构建索引与不同的规范。
从MongoDB 4.2.6,配置服务器主,默认情况下,检查索引不一致在分片的碎片集合,和命令("serverStatus"),主要配置服务器上运行时,返回字段shardedIndexConsistency
来报告索引不一致的分片集合的数量。
如果shardedIndexConsistency
报告任何索引不一致,则可以对分片集合运行以下管道,直到找到不一致为止。
注意
下面的管道用于MongoDB 4.2.4及以上版本。
- 定义以下聚合管道:
const pipeline = [
// Get indexes and the shards that they belong to.
{$indexStats: {}},
// Attach a list of all shards which reported indexes to each document from $indexStats.
{$group: {_id: null, indexDoc: {$push: "$$ROOT"}, allShards: {$addToSet: "$shard"}}},
// Unwind the generated array back into an array of index documents.
{$unwind: "$indexDoc"},
// Group by index name.
{
$group: {
"_id": "$indexDoc.name",
"shards": {$push: "$indexDoc.shard"},
// Convert each index specification into an array of its properties
// that can be compared using set operators.
"specs": {$push: {$objectToArray: {$ifNull: ["$indexDoc.spec", {}]}}},
"allShards": {$first: "$allShards"}
}
},
// Compute which indexes are not present on all targeted shards and
// which index specification properties aren't the same across all shards.
{
$project: {
missingFromShards: {$setDifference: ["$allShards", "$shards"]},
inconsistentProperties: {
$setDifference: [
{$reduce: {
input: "$specs",
initialValue: {$arrayElemAt: ["$specs", 0]},
in: {$setUnion: ["$$value", "$$this"]}}},
{$reduce: {
input: "$specs",
initialValue: {$arrayElemAt: ["$specs", 0]},
in: {$setIntersection: ["$$value", "$$this"]}}}
]
}
}
},
// Only return output that indicates an index was inconsistent, i.e. either a shard was missing
// an index or a property on at least one shard was not the same on all others.
{
$match: {
$expr:
{$or: [
{$gt: [{$size: "$missingFromShards"}, 0]},
{$gt: [{$size: "$inconsistentProperties"}, 0]},
]
}
}
},
// Output relevant fields.
{$project: {_id: 0, indexName: "$$ROOT._id", inconsistentProperties: 1, missingFromShards: 1}}
];
- 运行要测试的分片集合的聚合管道。例如,要测试分片集合是否测试。在相关的碎片上有不一致的索引:
db.getSiblingDB("test").reviews.aggregate(pipeline)
如果集合的索引不一致,则该集合的聚合将返回关于不一致索引的详细信息:
{ "missingFromShards" : [ "shardB" ], "inconsistentProperties" : [ ], "indexName" : "page_1_score_1" }
{ "missingFromShards" : [ ], "inconsistentProperties" : [ { "k" : "expireAfterSeconds", "v" : 60 }, { "k" : "expireAfterSeconds", "v" : 600 } ], "indexName" : "reviewDt_1" }
返回的文档指出了分片集合 test.reviews 的两个不一致之处:
- shardB上的集合中缺少一个名为
page_1_score_1
的索引。- 一个名为
reviewDt_1
的索引在集合的各个分片上具有不一致的属性,特别是expireAfterSeconds属性不同。
- 一个名为
要解决特定分片集合中缺少索引的不一致问题
从受影响的分片上的集合中删除不正确的索引,然后重建索引。要重建索引,您可以:
- 在受影响的分片上为集合执行滚动索引构建。
或者
- 从一个
mongos
实例发出一个索引构建db.collection.createIndex()
。该操作仅在没有索引的分片上构建集合的索引。
要解决索引属性在各个分片之间的差异
从受影响的分片上的集合中删除不正确的索引,并重新构建索引。重建索引,你可以:
- 在受影响的碎片上为集合执行滚动索引构建。
或者
- 从一个
mongos
实例发出一个索引构建db.collection.createIndex()
。该操作仅在没有索引的碎片上构建集合的索引。
或者,如果不一致是该expireAfterSeconds
属性,则可以运行collMod
命令以更新秒数,而不是删除并重建索引。
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05