如果想在项目中使用 Mongoose 来代替默认的 Mongo 模型,可以参见:

    使用 MongoDB 数据库,需要将模型中的配置 改为 mongo,修改配置文件 src/common/config/db.js

    多 HOST

    可以将配置里的 host 字段设置为数据支持多 host 的功能,如:

    1. export default {
    2. type: 'mongo',
    3. adapter: {
    4. mongo: {
    5. host: ['10.0.0.1', '10.0.0.2'],
    6. port: ['1234', '5678']
    7. }
    8. }
    9. }

    :此配置项在 2.0.14 版本中支持。

    配置选项

    如果要在连接 MongoDB 服务的时候添加额外的参数,可以通过在 options 里追加,如:

    1. export default {
    2. type: 'mongo',
    3. adapter: {
    4. mongo: {
    5. options: {
    6. authSource: 'admin',
    7. }
    8. }
    9. }
    10. }

    上面的配置后,连接 MongoDB 的 URL 变成类似于 mongodb://127.0.0.1:27017/?authSource=admin&replicaSet=xxx

    创建模型

    可以通过命令 thinkjs model [name] —mongo 来创建模型,如:

    1. thinkjs model user --mongo

    执行完成后,会创建文件 src/common/model/user.js。如果想创建在其他模块下,需要带上具体的模块名。如:

    会在 home 模块下创建模型文件,文件为 。

    模型需要继承 think.model.mongo 类,如果当前类不是继承该类,需要手动修改。

    ES6 语法

    1. export default class extends think.model.mongo {
    2. }

    动态创建类的方式

    1. module.exports = think.model('mongo', {
    2. })

    CRUD 操作

    CRUD 操作和 Mysql 中接口相同,具体请见 模型 -> 介绍

    mongo 模型可以配置索引,在增删改查操作之前模型会自动去创建索引,配置放在 indexes 属性里。如:

    1. export default class extends think.model.mongo {
    2. init(...args){
    3. super.init(...args);
    4. //配置索引
    5. this.indexes = {
    6. }
    7. }
    8. }

    单字段索引

    唯一索引

    1. export default class extends think.model.mongo {
    2. init(...args){
    3. super.init(...args);
    4. //配置索引
    5. this.indexes = {
    6. name: {$unique: 1}
    7. }
    8. }
    9. }

    多字段索引

    可以将多个字段联合索引,如:

    1. export default class extends think.model.mongo {
    2. super.init(...args);
    3. //配置索引
    4. email: 1
    5. test: {
    6. name: 1,
    7. title: 1,
    8. $unique: 1
    9. }
    10. }
    11. }
    12. }

    获取索引

    可以通过方法 getIndexes 获取创建的索引。如:

    1. export default class extends think.controller.base {
    2. async indexAction(){
    3. let model = this.model('user');
    4. let indexes = await model.getIndexes();
    5. }
    6. }

    可以通过 aggregate 方法进行混合操作。如:

    具体请见 。

    MapReduce

    可以通过 mapReduce 方法进行 MapReduce 操作。如:

    1. export default class extends think.model.mongo {
    2. execMapReduce(){
    3. let map = () => {
    4. emit(this.cust_id, this.amount);
    5. }
    6. let reduce = (key, values) => {
    7. return Array.sum(values);
    8. }
    9. return this.mapReduce(map, reduce, {
    10. query: {status: "A"},
    11. out: "order_totals"
    12. })

    具体请见 。