ThinkJS supports MongoDB database, underlying module is mongodb.
Change type
in model configuration to mongo
to use MongoDB database:
export default {
type: "mongo"
}
In order to add additional params when connecting MongoDB service, add them to options
:
export default {
type: "mongo",
adapter: {
mongo: {
options: {
authSource: 'admin',
replicaSet: 'xxx'
}
}
}
}
Based on this config, the connection URL will become to mongodb://127.0.0.1:27017/?authSource=admin
.
For more additional options, please read http://mongodb.github.io/node-mongodb-native/2.0/reference/connecting/connection-settings/.
Use command thinkjs model [name] --mongo
to create model:
thinkjs model user --mongo
After executing, src/common/model/user.js
will be created. If you want to place it within other module, add the specific module name:
thinkjs model home/user --mongo
This will create model file within home
module, file name is src/home/model/user.js
.
Model has to inherit think.model.mongo
class. If current class doesn't inherit it, you have to modify it:
export default class extends think.model.mongo {
}
module.exports = think.model("mongo", {
})
CRUD operations are same as Mysql, just read Model -> Introduction.
mongo model can config index, model will create index automatically before CRUD operations. Configurations are placed in indexes
property:
export default class extends think.model.mongo {
init(...args){
super.init(...args);
//config index
this.indexes = {
}
}
}
export default class extends think.model.mongo {
init(...args){
super.init(...args);
//config index
this.indexes = {
name: 1
}
}
}
Use $unique
to set unique index:
export default class extends think.model.mongo {
init(...args){
super.init(...args);
//config index
this.indexes = {
name: {$unique: 1}
}
}
}
You can combine multiple fields to create index:
export default class extends think.model.mongo {
init(...args){
super.init(...args);
//config index
this.indexes = {
email: 1
test: {
name: 1,
title: 1,
$unique: 1
}
}
}
}
Use getIndexes
to get created indexes:
export default class extends think.controller.base {
async indexAction(){
let model = this.model("user");
let indexes = await model.getIndexes();
}
}
Use aggregate
method to do aggregation:
export default class extends think.model.mongo {
match(){
return this.aggregate([
{$match: {status: "A"}},
{$group: {_id: "$cust_id", total: {$sum: "$amount"}}}
]);
}
}
Details stay at https://docs.mongodb.org/manual/core/aggregation-introduction/.
Use mapReduce
method to do MapReduce operations:
export default class extends think.model.mongo {
execMapReduce(){
let map = () => {
emit(this.cust_id, this.amount);
}
let reduce = (key, values) => {
return Array.sum(values);
}
return this.mapReduce(map, reduce, {
query: {status: "A"},
out: "order_totals"
})
}
}
Details stay at https://docs.mongodb.org/manual/core/aggregation-introduction/#map-reduce.