😻

MongoDB操作でフィルタリング/インデックス/情報確認

2022/10/21に公開

背景

今更ながらMongoDBを再学習中です。
今回は、コマンドラインからMongoDBを操作してみます。

前回の記事はこちらです。
https://zenn.dev/hashito/articles/75639ec2627305

Docker環境で試したい場合はこちらの記事を参照してください。
https://zenn.dev/hashito/articles/f036b50c3c33d1

操作

データ作成

前回の記事で作成したデータを流用します。
実際は、下記のコマンドで作成できます。

test> db.numbers.insertMany(new Array(20000).fill(0).map((v,i)=>{return {num:i}}))

データのフィルタ(大なり小なり)

とりあえずデータを参照する場合はfind()を引数無しで実行します。
そうすると、下記のようなデータを取得できます。

test> db.numbers.find()
[
  { _id: ObjectId("6350b47139e7cde9bce5f312"), num: 0 },
  { _id: ObjectId("6350b47139e7cde9bce5f313"), num: 1 },
  { _id: ObjectId("6350b47139e7cde9bce5f314"), num: 2 },
  { _id: ObjectId("6350b47139e7cde9bce5f315"), num: 3 },
  { _id: ObjectId("6350b47139e7cde9bce5f316"), num: 4 },
  { _id: ObjectId("6350b47139e7cde9bce5f317"), num: 5 },
  { _id: ObjectId("6350b47139e7cde9bce5f318"), num: 6 },
  { _id: ObjectId("6350b47139e7cde9bce5f319"), num: 7 },
  { _id: ObjectId("6350b47139e7cde9bce5f31a"), num: 8 },
  { _id: ObjectId("6350b47139e7cde9bce5f31b"), num: 9 },
  { _id: ObjectId("6350b47139e7cde9bce5f31c"), num: 10 },
  { _id: ObjectId("6350b47139e7cde9bce5f31d"), num: 11 },
  { _id: ObjectId("6350b47139e7cde9bce5f31e"), num: 12 },
  { _id: ObjectId("6350b47139e7cde9bce5f31f"), num: 13 },
  { _id: ObjectId("6350b47139e7cde9bce5f320"), num: 14 },
  { _id: ObjectId("6350b47139e7cde9bce5f321"), num: 15 },
  { _id: ObjectId("6350b47139e7cde9bce5f322"), num: 16 },
  { _id: ObjectId("6350b47139e7cde9bce5f323"), num: 17 },
  { _id: ObjectId("6350b47139e7cde9bce5f324"), num: 18 },
  { _id: ObjectId("6350b47139e7cde9bce5f325"), num: 19 }
]
Type "it" for more

この状態でitというコマンドを実行するとこれ以降も確認する事ができます。

test> it
[
  { _id: ObjectId("6350b47139e7cde9bce5f326"), num: 20 },
  { _id: ObjectId("6350b47139e7cde9bce5f327"), num: 21 },
  { _id: ObjectId("6350b47139e7cde9bce5f328"), num: 22 },
  { _id: ObjectId("6350b47139e7cde9bce5f329"), num: 23 },
  { _id: ObjectId("6350b47139e7cde9bce5f32a"), num: 24 },
  { _id: ObjectId("6350b47139e7cde9bce5f32b"), num: 25 },
  { _id: ObjectId("6350b47139e7cde9bce5f32c"), num: 26 },
  { _id: ObjectId("6350b47139e7cde9bce5f32d"), num: 27 },
  { _id: ObjectId("6350b47139e7cde9bce5f32e"), num: 28 },
  { _id: ObjectId("6350b47139e7cde9bce5f32f"), num: 29 },
  { _id: ObjectId("6350b47139e7cde9bce5f330"), num: 30 },
  { _id: ObjectId("6350b47139e7cde9bce5f331"), num: 31 },
  { _id: ObjectId("6350b47139e7cde9bce5f332"), num: 32 },
  { _id: ObjectId("6350b47139e7cde9bce5f333"), num: 33 },
  { _id: ObjectId("6350b47139e7cde9bce5f334"), num: 34 },
  { _id: ObjectId("6350b47139e7cde9bce5f335"), num: 35 },
  { _id: ObjectId("6350b47139e7cde9bce5f336"), num: 36 },
  { _id: ObjectId("6350b47139e7cde9bce5f337"), num: 37 },
  { _id: ObjectId("6350b47139e7cde9bce5f338"), num: 38 },
  { _id: ObjectId("6350b47139e7cde9bce5f339"), num: 39 }
]
Type "it" for more

特定の値が欲しい場合は、下記のように値を指定します。

test> db.numbers.find({num:39})
[ { _id: ObjectId("6350b47139e7cde9bce5f339"), num: 39 } ]

特定の値より大きいものが欲しい場合は$gtを利用します。
下記ではnumが19998より大きいものを検索しています。

test> db.numbers.find({num:{$gt:19998}})
[ { _id: ObjectId("6350b49a39e7cde9bce64131"), num: 19999 } ]

特定の値より小さいのものが欲しい場合は$ltを利用します。
下記ではnumが1より小さいものを検索しています。

test> db.numbers.find({num:{$lt:1}})
[ { _id: ObjectId("6350b47139e7cde9bce5f312"), num: 0 } ]

2つの条件を利用して、範囲を絞ることもできます。
下記は10より大きくて20より小さいものを検索しています。

test> db.numbers.find({num:{$gt:10,$lt:20}})
[
  { _id: ObjectId("6350b47139e7cde9bce5f31d"), num: 11 },
  { _id: ObjectId("6350b47139e7cde9bce5f31e"), num: 12 },
  { _id: ObjectId("6350b47139e7cde9bce5f31f"), num: 13 },
  { _id: ObjectId("6350b47139e7cde9bce5f320"), num: 14 },
  { _id: ObjectId("6350b47139e7cde9bce5f321"), num: 15 },
  { _id: ObjectId("6350b47139e7cde9bce5f322"), num: 16 },
  { _id: ObjectId("6350b47139e7cde9bce5f323"), num: 17 },
  { _id: ObjectId("6350b47139e7cde9bce5f324"), num: 18 },
  { _id: ObjectId("6350b47139e7cde9bce5f325"), num: 19 }
]

実行プラン

SQLでご存じの方もいると思いますが、EXPLAINという機能を使ってクエリがどのような処理を行っているかを確認する事ができます。
.explain("executionStats")という関数を呼び出し後につけると、実行プランを確認する事ができます。
executionStatsは詳細情報を出力するオプションとなります。

test> db.numbers.find({num:{"$gt":19999}}).explain("executionStats")
{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'test.numbers',
    indexFilterSet: false,
    parsedQuery: { num: { '$gt': 19999 } },
    queryHash: 'A1E79916',
    planCacheKey: 'A1E79916',
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'COLLSCAN',
      filter: { num: { '$gt': 19999 } },
      direction: 'forward'
    },
    rejectedPlans: []
  },
  executionStats: {
    executionSuccess: true,
    nReturned: 0,
    executionTimeMillis: 9,
    totalKeysExamined: 0,
    totalDocsExamined: 20000,
    executionStages: {
      stage: 'COLLSCAN',
      filter: { num: { '$gt': 19999 } },
      nReturned: 0,
      executionTimeMillisEstimate: 1,
      works: 20002,
      advanced: 0,
      needTime: 20001,
      needYield: 0,
      saveState: 20,
      restoreState: 20,
      isEOF: 1,
      direction: 'forward',
      docsExamined: 20000
    }
  },
  command: { find: 'numbers', filter: { num: { '$gt': 19999 } }, '$db': 'test' },
  serverInfo: {
    host: '080c60afc116',
    port: 27017,
    version: '6.0.2',
    gitVersion: '94fb7dfc8b974f1f5343e7ea394d0d9deedba50e'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600
  },
  ok: 1
}

executionStats.executionStages.docsExaminedが走査したドキュメント数になっており、20000になっているため全ての数値を確認して結果を出したことがわかります。

インデックスの作成

ensureIndexという関数を利用すると簡単にインデックス生成ができます。

test> db.numbers.ensureIndex({num:1})
[ 'num_1' ]

生成されたかどうかはgetIndexes()を呼び出すと確認できます。

test> db.numbers.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { num: 1 }, name: 'num_1' }
]

2つインデックスが存在しています。
1つはIDに関わるインデックスで標準で作成されます。

前回のコマンドで作成されたのはnumに関わるインデックスになります。

test> db.numbers.find({num:{"$gt":19995}}).explain("executionStats")
{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'test.numbers',
    indexFilterSet: false,
    parsedQuery: { num: { '$gt': 19995 } },
    queryHash: 'A1E79916',
    planCacheKey: '40DCF34C',
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'FETCH',
      inputStage: {
        stage: 'IXSCAN',
        keyPattern: { num: 1 },
        indexName: 'num_1',
        isMultiKey: false,
        multiKeyPaths: { num: [] },
        isUnique: false,
        isSparse: false,
        isPartial: false,
        indexVersion: 2,
        direction: 'forward',
        indexBounds: { num: [ '(19995, inf.0]' ] }
      }
    },
    rejectedPlans: []
  },
  executionStats: {
    executionSuccess: true,
    nReturned: 4,
    executionTimeMillis: 0,
    totalKeysExamined: 4,
    totalDocsExamined: 4,
    executionStages: {
      stage: 'FETCH',
      nReturned: 4,
      executionTimeMillisEstimate: 0,
      works: 5,
      advanced: 4,
      needTime: 0,
      needYield: 0,
      saveState: 0,
      restoreState: 0,
      isEOF: 1,
      docsExamined: 4,
      alreadyHasObj: 0,
      inputStage: {
        stage: 'IXSCAN',
        nReturned: 4,
        executionTimeMillisEstimate: 0,
        works: 5,
        advanced: 4,
        needTime: 0,
        needYield: 0,
        saveState: 0,
        restoreState: 0,
        isEOF: 1,
        keyPattern: { num: 1 },
        indexName: 'num_1',
        isMultiKey: false,
        multiKeyPaths: { num: [] },
        isUnique: false,
        isSparse: false,
        isPartial: false,
        indexVersion: 2,
        direction: 'forward',
        indexBounds: { num: [ '(19995, inf.0]' ] },
        keysExamined: 4,
        seeks: 1,
        dupsTested: 0,
        dupsDropped: 0
      }
    }
  },
  command: { find: 'numbers', filter: { num: { '$gt': 19995 } }, '$db': 'test' },
  serverInfo: {
    host: '080c60afc116',
    port: 27017,
    version: '6.0.2',
    gitVersion: '94fb7dfc8b974f1f5343e7ea394d0d9deedba50e'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600
  },
  ok: 1
}

この状態でfindを行うと全てに走査を行わず、対象の部分のみだけになっていることがわかります。

executionStats.executionStages.docsExamined:4

全て表示

show dbsにて全てのDBを参照する事ができます。

test> show dbs
admin   100.00 KiB
config   96.00 KiB
local    72.00 KiB
test      1.57 MiB

その下のcollectionはshow collectionsで参照する事ができます

test> show collections
numbers
numbers2

また、DBの詳細情報はstats()にて実行できます。

test> db.stats()
{
  db: 'test',
  collections: 2,
  views: 0,
  objects: 40000,
  avgObjSize: 31,
  dataSize: 1240000,
  storageSize: 655360,
  indexes: 3,
  indexSize: 991232,
  totalSize: 1646592,
  scaleFactor: 1,
  fsUsedSize: 16734789632,
  fsTotalSize: 62725623808,
  ok: 1
}

コレクションの情報も同じように参照できます。

test> db.numbers.stats()
{
  ns: 'test.numbers',
  size: 620000,
  count: 20000,
  avgObjSize: 31,
  numOrphanDocs: 0,
  storageSize: 417792,
  freeStorageSize: 180224,
  capped: false,
  wiredTiger: {
    metadata: { formatVersion: 1 },
    creationString: 'access_pattern_hint=none,allocation_size=4KB,app_metadata=(formatVersion=1),assert=(commit_timestamp=none,durable_timestamp=none,read_timestamp=none,write_timestamp=off),block_allocation=best,block_compressor=snappy,cache_resident=false,checksum=on,colgroups=,collator=,columns=,dictionary=0,encryption=(keyid=,name=),exclusive=false,extractor=,format=btree,huffman_key=,huffman_value=,ignore_in_memory_cache_size=false,immutable=false,import=(compare_timestamp=oldest_timestamp,enabled=false,file_metadata=,metadata_file=,repair=false),internal_item_max=0,internal_key_max=0,internal_key_truncate=true,internal_page_max=4KB,key_format=q,key_gap=10,leaf_item_max=0,leaf_key_max=0,leaf_page_max=32KB,leaf_value_max=64MB,log=(enabled=true),lsm=(auto_throttle=true,bloom=true,bloom_bit_count=16,bloom_config=,bloom_hash_count=8,bloom_oldest=false,chunk_count_limit=0,chunk_max=5GB,chunk_size=10MB,merge_custom=(prefix=,start_generation=0,suffix=),merge_max=15,merge_min=0),memory_page_image_max=0,memory_page_max=10m,os_cache_dirty_max=0,os_cache_max=0,prefix_compression=false,prefix_compression_min=4,readonly=false,source=,split_deepen_min_child=0,split_deepen_per_child=0,split_pct=90,tiered_object=false,tiered_storage=(auth_token=,bucket=,bucket_prefix=,cache_directory=,local_retention=300,name=,object_target_size=0),type=file,value_format=u,verbose=[],write_timestamp_usage=none',
    type: 'file',
    uri: 'statistics:table:collection-2-674196733780654585',
    LSM: {
      'bloom filter false positives': 0,
      'bloom filter hits': 0,
      'bloom filter misses': 0,
      'bloom filter pages evicted from cache': 0,
      'bloom filter pages read into cache': 0,
      'bloom filters in the LSM tree': 0,
      'chunks in the LSM tree': 0,
      'highest merge generation in the LSM tree': 0,
      'queries that could have benefited from a Bloom filter that did not exist': 0,
      'sleep for LSM checkpoint throttle': 0,
      'sleep for LSM merge throttle': 0,
      'total size of bloom filters': 0
    },
    'block-manager': {
      'allocations requiring file extension': 18,
      'blocks allocated': 18,
      'blocks freed': 5,
      'checkpoint size': 221184,
      'file allocation unit size': 4096,
      'file bytes available for reuse': 180224,
      'file magic number': 120897,
      'file major version number': 1,
      'file size in bytes': 417792,
      'minor version number': 0
    },
    btree: {
      'btree checkpoint generation': 606,
      'btree clean tree checkpoint expiration time': Long("9223372036854775807"),
      'btree compact pages reviewed': 0,
      'btree compact pages rewritten': 0,
      'btree compact pages skipped': 0,
      'btree skipped by compaction as process would not reduce size': 0,
      'column-store fixed-size leaf pages': 0,
      'column-store fixed-size time windows': 0,
      'column-store internal pages': 0,
      'column-store variable-size RLE encoded values': 0,
      'column-store variable-size deleted values': 0,
      'column-store variable-size leaf pages': 0,
      'fixed-record size': 0,
      'maximum internal page size': 4096,
      'maximum leaf page key size': 2867,
      'maximum leaf page size': 32768,
      'maximum leaf page value size': 67108864,
      'maximum tree depth': 3,
      'number of key/value pairs': 0,
      'overflow pages': 0,
      'row-store empty values': 0,
      'row-store internal pages': 0,
      'row-store leaf pages': 0
    },
    cache: {
      'bytes currently in the cache': 2705748,
      'bytes dirty in the cache cumulative': 1367,
      'bytes read into cache': 0,
      'bytes written from cache': 1254916,
      'checkpoint blocked page eviction': 0,
      'checkpoint of history store file blocked non-history store page eviction': 0,
      'data source pages selected for eviction unable to be evicted': 0,
      'eviction gave up due to detecting an out of order on disk value behind the last update on the chain': 0,
      'eviction gave up due to detecting an out of order tombstone ahead of the selected on disk update': 0,
      'eviction gave up due to detecting an out of order tombstone ahead of the selected on disk update after validating the update chain': 0,
      'eviction gave up due to detecting out of order timestamps on the update chain after the selected on disk update': 0,
      'eviction walk passes of a file': 0,
      'eviction walk target pages histogram - 0-9': 0,
      'eviction walk target pages histogram - 10-31': 0,
      'eviction walk target pages histogram - 128 and higher': 0,
      'eviction walk target pages histogram - 32-63': 0,
      'eviction walk target pages histogram - 64-128': 0,
      'eviction walk target pages reduced due to history store cache pressure': 0,
      'eviction walks abandoned': 0,
      'eviction walks gave up because they restarted their walk twice': 0,
      'eviction walks gave up because they saw too many pages and found no candidates': 0,
      'eviction walks gave up because they saw too many pages and found too few candidates': 0,
      'eviction walks reached end of tree': 0,
      'eviction walks restarted': 0,
      'eviction walks started from root of tree': 0,
      'eviction walks started from saved location in tree': 0,
      'hazard pointer blocked page eviction': 0,
      'history store table insert calls': 0,
      'history store table insert calls that returned restart': 0,
      'history store table out-of-order resolved updates that lose their durable timestamp': 0,
      'history store table out-of-order updates that were fixed up by reinserting with the fixed timestamp': 0,
      'history store table reads': 0,
      'history store table reads missed': 0,
      'history store table reads requiring squashed modifies': 0,
      'history store table truncation by rollback to stable to remove an unstable update': 0,
      'history store table truncation by rollback to stable to remove an update': 0,
      'history store table truncation to remove an update': 0,
      'history store table truncation to remove range of updates due to key being removed from the data page during reconciliation': 0,
      'history store table truncation to remove range of updates due to out-of-order timestamp update on data page': 0,
      'history store table writes requiring squashed modifies': 0,
      'in-memory page passed criteria to be split': 0,
      'in-memory page splits': 0,
      'internal pages evicted': 0,
      'internal pages split during eviction': 0,
      'leaf pages split during eviction': 0,
      'modified pages evicted': 0,
      'overflow pages read into cache': 0,
      'page split during eviction deepened the tree': 0,
      'page written requiring history store records': 0,
      'pages read into cache': 0,
      'pages read into cache after truncate': 1,
      'pages read into cache after truncate in prepare state': 0,
      'pages requested from the cache': 20262,
      'pages seen by eviction walk': 0,
      'pages written from cache': 14,
      'pages written requiring in-memory restoration': 0,
      'the number of times full update inserted to history store': 0,
      'the number of times reverse modify inserted to history store': 0,
      'tracked dirty bytes in the cache': 0,
      'unmodified pages evicted': 0
    },
    cache_walk: {
      'Average difference between current eviction generation when the page was last considered': 0,
      'Average on-disk page image size seen': 0,
      'Average time in cache for pages that have been visited by the eviction server': 0,
      'Average time in cache for pages that have not been visited by the eviction server': 0,
      'Clean pages currently in cache': 0,
      'Current eviction generation': 0,
      'Dirty pages currently in cache': 0,
      'Entries in the root page': 0,
      'Internal pages currently in cache': 0,
      'Leaf pages currently in cache': 0,
      'Maximum difference between current eviction generation when the page was last considered': 0,
      'Maximum page size seen': 0,
      'Minimum on-disk page image size seen': 0,
      'Number of pages never visited by eviction server': 0,
      'On-disk page image sizes smaller than a single allocation unit': 0,
      'Pages created in memory and never written': 0,
      'Pages currently queued for eviction': 0,
      'Pages that could not be queued for eviction': 0,
      'Refs skipped during cache traversal': 0,
      'Size of the root page': 0,
      'Total number of pages currently in cache': 0
    },
    'checkpoint-cleanup': {
      'pages added for eviction': 0,
      'pages removed': 0,
      'pages skipped during tree walk': 0,
      'pages visited': 2
    },
    compression: {
      'compressed page maximum internal page size prior to compression': 4096,
      'compressed page maximum leaf page size prior to compression ': 117968,
      'compressed pages read': 0,
      'compressed pages written': 12,
      'number of blocks with compress ratio greater than 64': 0,
      'number of blocks with compress ratio smaller than 16': 0,
      'number of blocks with compress ratio smaller than 2': 0,
      'number of blocks with compress ratio smaller than 32': 0,
      'number of blocks with compress ratio smaller than 4': 0,
      'number of blocks with compress ratio smaller than 64': 0,
      'number of blocks with compress ratio smaller than 8': 0,
      'page written failed to compress': 0,
      'page written was too small to compress': 2
    },
    cursor: {
      'Total number of entries skipped by cursor next calls': 0,
      'Total number of entries skipped by cursor prev calls': 0,
      'Total number of entries skipped to position the history store cursor': 0,
      'Total number of times a search near has exited due to prefix config': 0,
      'bulk loaded cursor insert calls': 0,
      'cache cursors reuse count': 20016,
      'close calls that result in cache': 20018,
      'create calls': 5,
      'cursor next calls that skip due to a globally visible history store tombstone': 0,
      'cursor next calls that skip greater than or equal to 100 entries': 0,
      'cursor next calls that skip less than 100 entries': 242458,
      'cursor prev calls that skip due to a globally visible history store tombstone': 0,
      'cursor prev calls that skip greater than or equal to 100 entries': 0,
      'cursor prev calls that skip less than 100 entries': 1,
      'insert calls': 20000,
      'insert key and value bytes': 671426,
      modify: 0,
      'modify key and value bytes affected': 0,
      'modify value bytes modified': 0,
      'next calls': 242458,
      'open cursor count': 0,
      'operation restarted': 0,
      'prev calls': 1,
      'remove calls': 0,
      'remove key bytes removed': 0,
      'reserve calls': 0,
      'reset calls': 40285,
      'search calls': 4,
      'search history store calls': 0,
      'search near calls': 242,
      'truncate calls': 0,
      'update calls': 0,
      'update key and value bytes': 0,
      'update value size change': 0
    },
    reconciliation: {
      'approximate byte size of timestamps in pages written': 0,
      'approximate byte size of transaction IDs in pages written': 0,
      'dictionary matches': 0,
      'fast-path pages deleted': 0,
      'internal page key bytes discarded using suffix compression': 22,
      'internal page multi-block writes': 0,
      'leaf page key bytes discarded using prefix compression': 0,
      'leaf page multi-block writes': 2,
      'leaf-page overflow keys': 0,
      'maximum blocks required for a page': 1,
      'overflow values written': 0,
      'page checksum matches': 0,
      'page reconciliation calls': 4,
      'page reconciliation calls for eviction': 0,
      'pages deleted': 0,
      'pages written including an aggregated newest start durable timestamp ': 0,
      'pages written including an aggregated newest stop durable timestamp ': 0,
      'pages written including an aggregated newest stop timestamp ': 0,
      'pages written including an aggregated newest stop transaction ID': 0,
      'pages written including an aggregated newest transaction ID ': 0,
      'pages written including an aggregated oldest start timestamp ': 0,
      'pages written including an aggregated prepare': 0,
      'pages written including at least one prepare': 0,
      'pages written including at least one start durable timestamp': 0,
      'pages written including at least one start timestamp': 0,
      'pages written including at least one start transaction ID': 0,
      'pages written including at least one stop durable timestamp': 0,
      'pages written including at least one stop timestamp': 0,
      'pages written including at least one stop transaction ID': 0,
      'records written including a prepare': 0,
      'records written including a start durable timestamp': 0,
      'records written including a start timestamp': 0,
      'records written including a start transaction ID': 0,
      'records written including a stop durable timestamp': 0,
      'records written including a stop timestamp': 0,
      'records written including a stop transaction ID': 0
    },
    session: {
      'object compaction': 0,
      'tiered operations dequeued and processed': 0,
      'tiered operations scheduled': 0,
      'tiered storage local retention time (secs)': 0
    },
    transaction: {
      'race to read prepared update retry': 0,
      'rollback to stable history store records with stop timestamps older than newer records': 0,
      'rollback to stable inconsistent checkpoint': 0,
      'rollback to stable keys removed': 0,
      'rollback to stable keys restored': 0,
      'rollback to stable restored tombstones from history store': 0,
      'rollback to stable restored updates from history store': 0,
      'rollback to stable skipping delete rle': 0,
      'rollback to stable skipping stable rle': 0,
      'rollback to stable sweeping history store keys': 0,
      'rollback to stable updates removed from history store': 0,
      'transaction checkpoints due to obsolete pages': 0,
      'update conflicts': 0
    }
  },
  nindexes: 2,
  indexBuilds: [],
  totalIndexSize: 778240,
  totalSize: 1196032,
  indexSizes: { _id_: 585728, num_1: 192512 },
  scaleFactor: 1,
  ok: 1
}

Discussion