根据MongoDB 的手册,在稀疏索引中,仅包含包含该字段的对象。我可以看到稀疏索引的大小(以字节为单位),但是如何查找它包含的对象数量?我正在对我的对象进行升级,这个数字是还有多少需要处理。
更新:我的索引字段是一个整数和一个 ObjectId。如果它们在索引中具有固定大小,我可以将其大小(以字节为单位)除以每个索引大小以获得近似值吗?当我删除具有该字段的对象时,磁盘上的稀疏索引大小可能不会缩小...
根据MongoDB 的手册,在稀疏索引中,仅包含包含该字段的对象。我可以看到稀疏索引的大小(以字节为单位),但是如何查找它包含的对象数量?我正在对我的对象进行升级,这个数字是还有多少需要处理。
更新:我的索引字段是一个整数和一个 ObjectId。如果它们在索引中具有固定大小,我可以将其大小(以字节为单位)除以每个索引大小以获得近似值吗?当我删除具有该字段的对象时,磁盘上的稀疏索引大小可能不会缩小...
如果设置了相应的字段,则对象将包含在稀疏索引中,即使它是null
. 因此,您可以使用$exists
来获取具有值集的元素的数量:
> db.Foo.count();
185
> db.Foo.find({"SparseField" : {$exists : true} }).count();
174
所以只有 11 个文档不在稀疏索引中。或者,您可以使用hint
强制使用稀疏索引的查询并用于explain
检索一些统计信息:
> db.Foo.find().hint("sparse_index_name").explain();
{
"cursor" : "BtreeCursor sparse_index_name",
"n" : 174,
}
使用CAVEAT查询的explain()
行为与不使用解释的查询不同。具体来说,db.Foo.find().hint("sparse_index_name").count()
将返回 185,而不是 174。
不时检查稀疏索引的正确使用是有意义的:
> db.Foo.find({"SparseField" : null }).count();
38
哎呀。这 38 个文档被索引,可能不是故意的。