Skip to content

Commit

Permalink
fix(mongo): create initial values
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Jan 28, 2022
1 parent c19cbd1 commit 4d5a473
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions plugins/database/mongo/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { MongoClient, Db, MongoError, IndexDescription } from 'mongodb'
import { Context, Database, Tables, makeArray, Schema, pick, omit, Query, Model, Dict, noop, KoishiError } from 'koishi'
import { Context, Database, Tables, makeArray, Schema, pick, omit, Query, Model, Dict, noop, KoishiError, isNullable } from 'koishi'
import { URLSearchParams } from 'url'
import { executeUpdate, executeEval } from '@koishijs/orm-utils'
import { transformQuery, transformEval } from './utils'
Expand Down Expand Up @@ -61,11 +61,9 @@ class MongoDatabase extends Database {
return this.client.close()
}

/** synchronize table schema */
private async _syncTable(name: string) {
await this._tableTasks[name]
const coll = await this.db.createCollection(name).catch(() => this.db.collection(name))
private async _createIndexes(name: string) {
const { primary, unique } = this.ctx.model.config[name]
const coll = this.db.collection(name)
const newSpecs: IndexDescription[] = []
const oldSpecs = await coll.indexes()
;[primary, ...unique].forEach((keys, index) => {
Expand All @@ -84,6 +82,24 @@ class MongoDatabase extends Database {
await coll.createIndexes(newSpecs)
}

private async _createFields(name: string) {
const { fields } = this.ctx.model.config[name]
const coll = this.db.collection(name)
await Promise.all(Object.keys(fields).map((key) => {
if (isNullable(fields[key].initial)) return
return coll.updateMany({ [key]: { $exists: false } }, { $set: { [key]: fields[key].initial } })
}))
}

/** synchronize table schema */
private async _syncTable(name: string) {
await this._tableTasks[name]
await Promise.all([
this._createIndexes(name),
this._createFields(name),
])
}

private _createFilter(name: string, query: Query) {
return transformQuery(this.ctx.model.resolveQuery(name, query))
}
Expand Down Expand Up @@ -114,6 +130,7 @@ class MongoDatabase extends Database {
async get(name: TableType, query: Query, modifier: Query.Modifier) {
const filter = this._createFilter(name, query)
if (!filter) return []
await this._tableTasks[name]
let cursor = this.db.collection(name).find(filter)
const { fields, limit, offset = 0, sort } = Query.resolveModifier(modifier)
cursor = cursor.project({ _id: 0, ...Object.fromEntries((fields ?? []).map(key => [key, 1])) })
Expand Down

0 comments on commit 4d5a473

Please sign in to comment.