快速上手
手册
基本概念
MongoDB 概念 |
对应 RDBMS 概念 |
database |
database |
collection |
table |
document |
row |
field |
column |
MongoDB 是由 C++ 编写的一个基于分布式文件存储的开源数据库系统。
MongoDB 将数据存储为一个文档,由 K - V 对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
基本操作
- “show dbs” 或 “show databases” 显示所有的数据库。
1 2 3 4 5 6 7 8 9 10 11
| >show databases <admin 40.00 KiB config 36.00 KiB local 72.00 KiB test 72.00 KiB >show dbs <admin 40.00 KiB config 36.00 KiB local 72.00 KiB test 72.00 KiB
|
1 2
| >use test <'switched to db test'
|
“db.clname.insert()” 插入一条或多条 document。
“db.clname.insertOne()” 插入一条 document。
“db.clname.insertMany()” 插入多条 document。
插入 document 时,会自动创建 collection。若插入的数据无 _id 字段,会自动生成。
1 2 3 4 5 6 7 8 9 10 11 12
| >db.students.insert([ { name : "zhangsan", age : 18 }, { name : "lisi", age : 19 } ]) >db.students.insertOne({ name : "wangwu", age : 18}) >db.students.find() <{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"), name: 'zhangsan', age: 18 } { _id: ObjectId("633aa225f3b1a9afbafe6fca"), name: 'lisi', age: 19 }
|
“db.clname.find()” 查询符合条件的 document。
“db.clname.findOne()” 查询符合条件的 document 的第一个。
“db.clname.find().count()” 计数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| >db.students.find({age : 18}) <{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"), name: 'zhangsan', age: 18 } { _id: ObjectId("633aa529f3b1a9afbafe6fcb"), name: 'wangwu', age: 18 }
>db.students.findOne({age : 18}) <{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"), name: 'zhangsan', age: 18 }
>db.students.find({age : 18}).count() <2
|
“db.clname.update()” $set 修改属性,$unset 删除属性。默认只修改一个。已过时。
“db.clname.updateOne()” 修改单个 document 的字段。
“db.clname.updateMany()” 修改多个 document 的字段。
“db.clname.replaceOne()” 替换指定的一整个 document 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| >db.students.update( { name : "zhangsan"}, { $set : { age : 20, gender : "man"}, $unset : { name : ""} }, { multi : true } ) >db.students.find({gender : "man"}) <{ _id: ObjectId("633aa225f3b1a9afbafe6fc9"), age: 20, gender: 'man' }
>db.students.updateOne( { gender : "man" }, { $set : { name: "zhangsan" } } ) >db.students.find({gender : "man"}) <{_id: ObjectId("633aa225f3b1a9afbafe6fc9"), age: 20, gender: 'man', name: 'zhangsan' }
>db.students.replaceOne( { name : "zhangsan"}, { name : "zhangsaner", age : 21, gender : "man" } ) >db.students.find({name : "zhangsaner"}) <{_id: ObjectId("633aa225f3b1a9afbafe6fc9"), name: 'zhangsaner', age: 21, gender: 'man' }
|
“db.clname.remove()” 删除符合条件的多个 document。已过时。
“db.clname.deleteOne()” 删除符合条件的多个 document。
“db.clname.deleteMany()” 删除符合条件的多个 document。
1 2 3 4 5 6 7 8
| >db.students.deleteOne({name : "zhangsaner"}) >db.students.find() <{ _id: ObjectId("633aa225f3b1a9afbafe6fca"), name: 'lisi', age: 19 } { _id: ObjectId("633aa529f3b1a9afbafe6fcb"), name: 'wangwu', age: 18 }
|
- 嵌套多层查询,属性名必须作为一整个字符串,用引号包裹。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| >db.students.updateOne( { name : "lisi" }, { $set : { address: { country : "China", city : "Beijing" } } } ) >db.students.find({ "address.country" : "China"}) <{_id: ObjectId("633aa225f3b1a9afbafe6fca"), name: 'lisi', age: 19, address: { country: 'China', city: 'Beijing' } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| >db.students.find( { age : { $gt : 18, $lt : 20 } } ) <{ _id: ObjectId("633aa225f3b1a9afbafe6fca"), name: 'lisi', age: 19, address: { country: 'China', city: 'Beijing' } }
>db.students.updateMany( { $or : [ { age : {$gt : 18} }, { name : "wangwu" } ] }, { $inc : { age : 5 } } ) >{ _id: ObjectId("633aa225f3b1a9afbafe6fca"), name: 'lisi', age: 19, address: { country: 'China', city: 'Beijing' } } { _id: ObjectId("633aa529f3b1a9afbafe6fcb"), name: 'wangwu', age: 18 }
|
limit() 限制查询数量
skip() 跳过指定数量
1
| >db.students.find().skip(10).limit(10)
|
1
| >db.students.find({}, {name : 1, _id : 0}).sort({age : 1, name : -1})
|
Mongoose
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
mongoose.connection.on('error', function() { console.log("数据库连接失败") }); mongoose.connection.once('open', function() { console.log("数据库连接成功") });
mongoose.connection.once('close', function() { console.log("数据库断开") }); mongoose.disconnect();
|
1 2 3 4 5 6 7 8
| var stuSchema = new mongoose.Schema({ name : String, age : Number, gender : { type : String, default : "male" } });
|
- Model ,对应 collection。mongoose.model(“modelName”, schemaName);
1 2 3
|
var StuModel = mongoose.model("student", stuSchema);
|
1.插入一条或多条数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| StuModel.create({ name : "zhangsan", age : 18, gender : "male" }, function (err) { if (!err) { console.log("插入成功"); } });
StuModel.create([{ name : "li", age : 19 }, { name : "wangwu", age : 20 }], function (err) { if (!err) { console.log("插入成功"); } });
|
2.查询数据。find(condition, [projection], [options], callback)、findById()、findOne()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| StuModel.find({ name : "zhangsan" }, { name : 1, age : 1, _id : 0 }, { skip : 1, limit : 2 }, function (err, docs) { if (!err) { console.log(docs[0] instanceof StuModel); console.log(docs[0].name); } });
|
3.修改数据。updateOne()、updateMany()
1 2 3 4 5 6 7 8 9 10 11
| StuModel.updateOne({ name : "zhangsan" }, { $set : { age : 22 } }, function (err) { if (!err) { console.log("修改成功"); } })
|
4.删除数据。deleteOne(condition, callback)、deleteMany()
5.统计数量。count(condition, callback)
1 2 3 4 5
| StuModel.count({}, function (err, count){ if (!err) { console.log("数量为", count); } })
|
1 2 3 4 5 6 7 8
| StuModel.findOne({ name : "zhangsan" }, function (err, doc) { if (!err) { console.log(doc.get("gender")); doc.set("age", 30); } });
|
设置 models 文件夹,存放各个 model 文件
1 2 3 4 5 6 7 8 9 10 11 12 13
|
var mongoose = require("mongoose") var stuSchema = new mongoose.Schema({ name : String, age : Number, gender : { type : String, default : "male" } }); var StuModel = mongoose.model("student", stuSchema); module.exports = StuModel;
|