--- collections: # create following collections with specific options - collection: messages options: storageEngine: wiredTiger: configString: block_compressor=zlib - collection: attachments.files type: gridfs options: storageEngine: wiredTiger: configString: block_compressor=zlib - collection: attachments.chunks type: gridfs options: storageEngine: wiredTiger: configString: block_compressor=zlib indexes: # Indexes for the user collection - collection: users type: users # index applies to users database index: name: users key: username: 1 - collection: users type: users # index applies to users database index: name: users_dotless unique: true key: unameview: 1 - collection: users type: users # index applies to users database index: name: show_new key: created: -1 - collection: users type: users # index applies to users database index: name: users_namespace key: ns: 1 unameview: 1 # Indexes for the addresses collection - collection: addresses type: users # index applies to users database index: name: address key: address: 1 - collection: addresses type: users # index applies to users database index: name: address_dotless unique: true key: addrview: 1 _id: 1 - collection: addresses type: users # index applies to users database index: name: user key: user: 1 # Indexes for the application specific passwords collection - collection: asps type: users # index applies to users database index: name: user key: user: 1 # Indexes for the authentication log collection - collection: authlog type: users # index applies to users database index: name: user key: user: 1 _id: -1 - collection: authlog type: users # index applies to users database index: name: entry_autoexpire # autoremove log entries after expire days expireAfterSeconds: 0 key: expires: 1 - collection: authlog type: users # index applies to users database index: name: entry_by_group sparse: true key: user: 1 group: 1 # Indexes for the filters collection - collection: filters index: name: user key: user: 1 # Indexes for the autoreply collection - collection: autoreplies index: name: user key: user: 1 # Indexes for the mailboxes collection - collection: mailboxes index: name: user_path unique: true key: user: 1 path: 1 - collection: mailboxes index: name: user_subscribed key: user: 1 subscribed: 1 - collection: mailboxes index: name: find_by_type key: user: 1 specialUse: 1 # Indexes for the messages collection - collection: messages index: name: user_messages_by_thread key: user: 1 thread: 1 - collection: messages index: # use also as sharding key name: mailbox_uid key: mailbox: 1 uid: 1 _id: 1 - collection: messages index: # use also as sharding key name: mailbox_uid_reverse key: mailbox: 1 uid: -1 _id: -1 - collection: messages index: # several message related queries include the shard key values name: mailbox_uid_shard key: _id: 1 mailbox: 1 uid: 1 - collection: messages index: name: newer_first key: mailbox: 1 uid: -1 - collection: messages index: name: mailbox_modseq_uid key: mailbox: 1 modseq: 1 uid: 1 - collection: messages index: name: mailbox_flags key: mailbox: 1 flags: 1 - collection: messages index: name: by_modseq key: mailbox: 1 modseq: 1 - collection: messages index: name: by_idate key: mailbox: 1 idate: 1 - collection: messages index: name: by_hdate key: mailbox: 1 hdate: 1 msgid: 1 - collection: messages index: name: by_size key: mailbox: 1 size: 1 - collection: messages index: name: by_headers key: mailbox: 1 headers.key: 1 headers.value: 1 - collection: messages index: # there can be only one $text index per collection name: fulltext key: user: 1 searchable: 1 headers.value: text text: text sparse: true - collection: messages index: # in most cases we only care about unseen, not seen messages name: mailbox_unseen_flag key: mailbox: 1 unseen: 1 - collection: messages index: # some mail agents list messages that do not have the \Deleted flag set name: mailbox_undeleted_flag key: mailbox: 1 undeleted: 1 - collection: messages index: name: mailbox_flagged_flag key: mailbox: 1 flagged: 1 - collection: messages index: name: mailbox_draft_flag key: mailbox: 1 draft: 1 - collection: messages index: name: has_attachment key: mailbox: 1 ha: 1 - collection: messages index: # This filter finds all messages that are expired and must be deleted. # Not sure about performance though as it is a global query name: retention_time partialFilterExpression: exp: true key: exp: 1 rdate: 1 # Indexes for the attachments collection # attachments.files collection should be sharded by _id (hash) # attachments.chunks collection should be sharded by files_id (hash) - collection: attachments.files type: gridfs # index applies to gridfs database index: name: attachment_id_hashed key: _id: hashed - collection: attachments.files type: gridfs # index applies to gridfs database index: name: related_attachments key: metadata.c: 1 metadata.m: 1 - collection: attachments.chunks type: gridfs # index applies to gridfs database index: # hashed index needed for sharding name: chunks_shard key: files_id: hashed # Indexes for the journal collection - collection: journal index: # this index is used to apply changes in a mailbox for IMAP session name: mailbox_modseq key: mailbox: 1 modseq: 1 - collection: journal index: # this index is used to send updates to a logged in webmail user name: user_limit_id key: user: 1 _id: 1 - collection: journal index: # this index is used to find the latest journal entry name: user_limit_id_reverse key: user: 1 _id: -1 - collection: journal # delete journal entries after 3 hours index: name: journal_autoexpire expireAfterSeconds: 10800 key: created: 1 # Indexes for the threads collection - collection: threads index: name: thread_shard key: user: hashed - collection: threads index: name: thread key: user: 1 ids: 1 - collection: threads index: name: thread_autoexpire # autoremove thread indexes after 180 days of inactivity expireAfterSeconds: 15552000 key: updated: 1 # Indexes for IRC - collection: nicks index: name: irc_nicks unique: true key: ns: 1 nickview: 1 user: 1 - collection: channels index: name: irc_channels unique: true key: ns: 1 channelview: 1