使用数据库:
use test
显示当前库中的所有集合(相当于关系型数据库中的表):
show collections
或show dbs
显示当前库中所有的集合名:
db.getCollectionNames()
-
开启数据库认证(linux系统在/etc/mongod.conf(mongodb3.x及以上版本)或/etc/mongodb.conf):
# mongod.conf(3.x及以上版本): security: authorization: enabled # mongdb.conf: auth=true
-
设置用户:
use admin // 进入到admin库中去设置 db.createUser( { user: "用户名", pwd: "密码", roles: [{role: ["角色列表"], db: "admin"}] } ) // 设置完毕后重启mongoDB数据库服务 // 然后重新进入mongodb客户端验证是否用户设置成功: use admin db.auth("用户名", "密码") // 或者执行命令时直接指定 mongo --port 27017 -u "用户名" -p "密码" --authenticationDatabase "admin"
-
Ubuntu 16.x中对服务的操作
service [服务名] start # 启动服务器 service [服务名] stop # 启动服务器
-
查看服务的状态
systemctl status [服务器]
-
添加(插入)
-
db.<collection>.insert()
向集合中插入一个或多个文档
// 插入一个文档 db.stus.insert({name: "猪八戒", age: 28, gender: "男"}); // 插入多个 db.stus.insert([ {name: "沙和尚", age: 38, gender: "男"}, {name: "白骨精", age: 16, gender: "女"} ]); // 默认_id属性表示数据唯一性 _id: ObjectId("5e97359053f77289926c54e4"); // 如果自己手动添加了_id,则数据库就不会自动生成时间戳Id属性了(数据必须唯一,所以建议还是使用数据库自带的)
db.<collection>.insertOne()
向集合中插入一个文档
在version3.2
中新加的db.<collection>.insertMany()
想集合中插入多个文档
在version3.2
中新加的
-
-
查询
-
db.<collection>.find()
如果不传入参数,则直接查询所有数据
// 查询stus集合中的所有数据(返回一个数组) db.stus.find(); // 同上,查询集合中所有数据(返回一个数组) db.stus.find({}); // 查找_id值为“hello”的文档(符合条件的均会查找出来,返回数组) db.stus.find({_id: "hello"}); // 查找符合age是16且name为"hello"的文档(AND, 返回数组) db.stus.find(age: 16, name: "hello"); // 查询集合中符合条件的第一条记录(只返回一个对象) db.stus.findOne({name: "hello"}); // 如果要通过内嵌文档对文档进行查询,此时需要属性名使用引号(单引号、双引号都可) db.users.find({"hobby.movies": "hero"}); // 统计文档的数量(符合条件的数据数据量) == 更常用 db.stus.find({}).count(); // 同上, 一般情况下数量相同 db.stus.find({}).length(); // 设置显示数据的上限(即获取多少条数据), skip与limit方法顺序没有限定 db.numbers.find().skip(`要跳过的条目数`).limit(`获取多少数据`); // 排序(大于0升序,小于0降序) // 多个排序规则逗号分隔,类似sql语句中的order by db.numbers.find().sort({`要排序的字段`: `大于0的值或小于0的值`,`要排序的字段`: `大于0的值或小于0的值`, ...}); // limit、skip、sort可以任意顺序调用: 数据库的执行顺序都是: sort、skip、limit // 在查询时可以在第二个参数的位置设置查询结果的投影(类似sql里边的查询字段) db.emp.find({}, {ename: 1, _id: 0, ...}) // 可以给查询结果给出要显示的字段: 1显示,0不显示
查询操作符:
$eq 等于 $gt 大于 $gte 大于等于 $in 包含,相当于sql中的in $lt 小于 $lte 小于等于 $ne 不等于 $nin 不包含,相当于sql中的not in
-
-
更新
-
db.<collection>.update(
查询条件
,新对象
)// 更新前一般先查询, 默认情况下会用新对象替换旧对象 // 默认情况下只会修改一个, 第三个参数可选 db.stus.update({name: "沙和尚"}, {age: 28}, { upsert: <boolean值>, multi: <boolean值>, // 默认不修改多个 writeConcern: <document: 即对象>, collation: <document: 即对象> }); // 如果修改指定的属性,而不是替换,则需要使用修改操作符 // 语法: operation: {....} db.stus.update({_id: ObjectId(9fd43243258923dcdf)}, {$set: {name: "沙和尚"}}); // 删除文档的指定属性 db.stus.update({_id: ObjectId(xxxx)}, {$unset: {name: "因为是删除属性,所以什么值都行"}}); // 同时修改多个符合条件的文档 db.stus.updateMany({_id: ObjectId(473892478923784923)}, {$set: {address: "高辣庄"}}); // 向数据库中的数组属性追加数据 db.stus.update({_id: ObjectId(473892478923784923)}, {$push: {address: "高辣庄"}}); // 向数据库中的数组属性追加数据(数据重复不追加) db.stus.update({_id: ObjectId(473892478923784923)}, {$addToSet: {address: "高辣庄"}}); // 只更改单个数据 db.stus.updateOne({name: "沙和尚"}, {age: 28}); // 替换文档 db.stus.replaceOne({name: "沙和尚"}, {age: 28});
-
-
删除
- db.<collection>.remove({
删除条件
}, {可选参数
});
// 删除符合条件的数据(数据有多个则一起删除) db.stus.remove({_id: "hello"}); // 删除符合条件的一个数据(如果有多个,则只删除第一个) db.stus.remove({_id: "hello"}, { justOne: <boolean值>, writeConcern: <document: 即对象> }); // 删除所有(传空时表示全部删除, 性能较差) db.stus.remove({}); // 所有要删除直接移除集合即可(如何集合全部没有后,数据库也随之删除) db.stus.drop(); // 删除数据库 db.dropDatabase(); // 删除一条数据 db.stus.deleteOne({_id: "hello"}); // 删除多条数据 db.stus.deleteMany({_id: "hello"});
- db.<collection>.remove({
-
Mongoose
安装依赖: yarn i mongoose --save 或者 npm i mongoose --save
// 引入Mongoose依赖 const mongoose = require('mongoose'); // 连接mongoDB数据库 // 连接格式: mongodb://[username:password]@127.0.0.1/databaseName?authSource=[用户保存的数据库名] mongoose.connect('mongodb://localhost/test', {useNewUrlParser: true, useUnifiedTopology: true}); // 连接成功后回调 mongoose.connection.once("open", () => { console.log("MongoDB数据库链接成功!") }); // 断开连接前回调 mongoose.connection.once("close", () => { console.log("MongoDB数据库断开连接!"); }); /** * MongoDB一般情况只需要连接一次就可,除非项目停止, * 服务器关闭,否则连接一般不会断开。 * (关系型数据库需要操作事务,所以每次操作完毕都需要进行一次断开连接,但是MongoDB是菲关系型数据库 * 没有事务控制,所以不需要考虑事务问题。) */ // mongoose.disconnect(); /** * mongoose 提供了三个核心对象 * 1. Schema 建立档案时的约束 * 2. Model -> 对应Collection (相当于关系型数据库中的表) * 3. Document -> 对应记录 (相当于关系型数据的每行的记录数据) */ let Schema = mongoose.Schema; // 创建表的约束 let testSchema = new Schema({ name: String, addr: String, create_time: { type: Date, default: Date.now } }); // 创建Model: 因为对应的是集合,所以最好使用大写命名 // mongoose 会动将集合名变成为复数 let TestModel = mongoose.model("test", testSchema); /** * 相关Model: * 用于创建文档(一个或多个,即一个对象或对象数组),并添加到集合中 * 1.Model.create(doc(s), (err) => {}) // callback: 完成操作后的回调函数 * 回调函数有两个参数: 1: err -> 错误对象 2: 插入成功的数据 * 2. Model.findById("ID值字符串" , ..., (err, doc) => {查询的数据, doc为document对象, 是Model的一个实例} ) 通过主键ID查询, 回调函数中返回的Document对象 * 3. Model.findOne() 只查询一个数据 * 4. Model.find({查询条件对象},”字段投影, 多个字段空格隔开,如果不需要则在前面加个一个减号:-“ | {可以使用传统的投影方式,即需要显示字段为key,值取1为显示,0不显示},{skip: 10 [跳过多少条数据] , limit: 2 [取几条数据], sort: 1 [排序升序]} , (err, doc) =>{返回的数据, doc为document对象,是Model的一个实例}) 查询数据(返回数组) * 5. Model.update({查询条件}, {修改修饰符: {要修改的数据}}, {multi(多数据影响): true}[可选参数] , (err) = > {回调函数}) 符合条件的都更新 * 6. MOdel.updateOne() 更新一个 * 7. Model.remove({删除条件}, (err)=>{回调函数}); * 7. Model.deleteOne({删除条件}, (err)=>{回调函数}); * 7. Model.deleteMany({删除条件}, (err)=>{回调函数}); * 8. Model.count({要统计的数据条件}, (err, data) => {回调函数,data为统计的结果}); */ /** * Document相关 * 1. new Model({ * 对象数据 * }); -> 创建一个Document对象 * 2. Document实例.save() -> 保存数据 * 3. Document实例.update({修改的数据}, (err, data) => { * //... * }) -> 保存数据 * 4. doc.[字段名] = 值; doc.save() -> 也可以保存数据 * 6. doc.get(字段名名) -> 获取文档的对应属性值 doc.属性值 -> 也可以获取对应属性值 * 7. doc.set(Key,Value) -> 修改文档对应属性的值, 但没有调用save之前不会保存到数据库中 * 8. doc._id 或 doc.id -> 获取主键值 **9. doc.toJSON() 转换为JSON对象 * 10.doc.toObject() 将document对象转成普通的js对象 * 11. doc对象无法使用delete */ // 插入一条新数据 TestModel.create({ name: "孙悟空", addr: "花果山水帘洞" }, (err) => { if(!err){ console.log("新增成功!"); } }); // 统计数据结果 TestModel.count({}, (err, data) => { console.log(data); }); // 插入多条数据 TestModel.create([ { name: "猪八戒", addr: "摩云洞" }, { name: "唐僧", addr: "东土大唐" } ], (err) => { if(!err){ console.log("新增成功!"); } });
命名规范:
- 集合是多个,所有一般使用单词复数来命名