mongodb的基础了解
MongoDB
mongodb 文档型数据库 类json binary json 非关系型 (nosql)
数据库 (db) 集合(collection)表 文档(document) 数据
安装配置
* 有一个左下角小箭头 千万取消
* 缺少 api-win-ms 文件 去postman 找
* 缺少文件 C/data/db
* mongod 运行数据库
* mongo 通过终端(cmd 命令行) 链接数据库 并且可以执行 查询语句
* mongodb 数据库
* mongoose node的第三方插件 用来链接数据库
* mongodb node的第三方插件 用来链接数据库
*db操作
db 指代当前使用的数据库
show dbs (databases) 显示所有的数据库
use dbname 切换数据库 创建数据库(如果数据库为空则为临时数据库)
如果要创建非临时数据库 在db里面创建一个集合
db.dropDatabase();
*collection操作
db.createCollection('name') 创建一个集合
show collecitons 查看当前所有的集合
db.name.drop() 删除数据集合
*document操作
插入 db.name.insert(obj)
* 插入多条数据参数为数组 db.name.insert([{},{},{}]
* 插入是如果指定_id _id必须为唯一不重复
插入 db.name.save(obj)
* 如果主键不重复 等同于插入
* 如果主键重复 那就是覆盖
查询 db.name.find(obj)
固值寻找
寻找age集合里面所有含有属性值为wscats的文档结果,相当于where name = 'wscats'
db.age.find({name:"wscats"})
*db.name.find({key1:vale,key2:value......})
*db.name.find({age:{$lt:17}})
db.name.find().pretty() 将find查找的数据进行格式化 目的好看一点
AND和OR寻找
AND
在find()方法中,如果通过使用,将它们分开传递多个键,则mongodb将其视为AND条件。 以下是AND的基本语法
寻找_id为1并且name为wscats的所有结果集
db.age.find( { $and: [ {"_id": 1}, {"name": "wscats"} ] } )
OR
在要根据OR条件查询文档,需要使用$or关键字。以下是OR条件的基本语法
寻找name为corrine或者name为wscats的所有结果集
db.age.find( { $or: [ {"name": "corrine"}, {“name“: "wscats"} ] } )
AND和OR等结合
相当于语句where title = "wscats" OR ( title = "corrine" AND _id < 5)
db.age.find({ $or: [{ "title": "wscats" }, { $and: [{ "title": "corrine" }, { "_id": { $lte: 5 } }] }] })
修改
db.name.update({查询条件},{$set 修改的数据},{multi:修改多条}) //修改更新
* 只修改第一条查到的数据
删除 db.name.remove(obj)
* db.name.remove({}) 全部删除
skip: 跳过几条
limit: 限制几条数据
sort:1 正序 -1 倒叙
skip和limit 顺序无干系 都是先跳过后限制
Limit与Skip方法
Limit
如果你需要在mongodb中读取指定数量的数据记录,可以使用mongodb的Limit方法,limit()方法接受一个数字参数,该参数指定从mongodb中读取的记录条数。
db.age.find().limit(数量)
Skip
我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
db.age.find().limit(数量).skip(数量) //skip()方法默认值为0
所以我们在实现分页的时候就可以用limit来限制每页多少条数据(一般固定一个值),用skip来决定显示第几页(一个有规律变动的值)
#####主键
* _id 唯一不重复 mongodb中主键可以自动生成 objectId 也可以人为指定
* 在mongodb中没有表头的概念 插入的数据长度不限制 可以插入每一条都不一样的数据
##### 分页
page 代表页数 1
pagesize 每页数量 2
db.name.find().skip((page-1)*pagesize).limit(pagesize)
排序
在mongodb中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列。
1 升序排列 -1 降序排列
db.集合名.find().sort({键值(属性值):1})
把age集合表重新根据_id主键进行降序排列
db.age.find().sort({ "_id": -1 })
Node.js连接
安装mongodb的模块
npm install mongodb
1.连接数据库
var MongoClient = require('mongodb').MongoClient; //结尾是选择数据库名 var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("连接成功!"); });
2.查询数据
注意查询回来的结果需要toArray来遍历处理
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("连接成功!"); //选中age集合,并用find方法把结果集拿回来进行处理 db.collection("age").find({title: "cba"}).toArray(function(err, result) { if (err) { console.log('Error:' + err); return; } console.log(result); }); });
经过测试,读取大于100条的时候会出现报错官网解释,可以尝试用forEach代替
db.collection('pokemon').find({}) .forEach(function(item){ console.log(item) })
查询ID
查询自动生成的ObjectId
var ObjectId = require('mongodb').ObjectId; let _id = ObjectId("5bcae50ed1f2c2f5e4e1a76a"); db.collection('xxx').find({ "_id": _id }).forEach(function (item) { console.log(item) })
3.插入数据
insert函数第一个参数是需要插入的值(可以一个也可以多个),第二个参数是接受一个回调函数,当值插入成功后回返回插入值得一些关键信息,比如_id
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("连接成功!"); const db = client.db("demo"); db.collection("age").insert([ { title: "插入的值A" }, { title: "插入的值B" } ], function(err, result) { if (err) { console.log('Error:' + err); return; } console.log(result) }) });
4.更新数据
注意如果不加$set就是完全替换原来的那份(没有设置的属性值将会丢失),加上$set则只是更新对应的属性值,其余不做改变
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("连接成功!"); db.collection("age").update({ "_id": 1 }, { $set: { title: "你好,世界", skill: "js" } }, function(err, result) { if (err) { console.log('Error:' + err); return; } //console.log(result); }); });
5.删除数据
var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/wscats'; MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("连接成功!"); db.collection("age").remove({ "_id": 1 }, function(err, result) { if (err) { console.log('Error:' + err); return; } //console.log(result); //关闭数据库 db.close(); }); });
6.关闭数据库
db.close();
封装自定义模块
新建mongo.js写入以下代码,封装自定义模块,方便其他路由复用,注意assert是node自带的断言模块,用于测试代码
参考
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); const url = 'mongodb://localhost:27017'; const dbName = 'shop'; function query(callback) { MongoClient.connect(url, function(err, client) { assert.equal(null, err); console.log("Connected successfully to server"); const db = client.db(dbName); callback(db); client.close(); }); } module.exports = { query }
在路由文件中引入和使用
var mongo = require('./mongo.js') router.post('/addproduct', function(req, res, next) { mongo.query(function(db) { db.collection("product").insertMany([req.body], function(err, result) { console.log("Inserted 1 document into the collection"); res.send('respond with a resource'); }); }) });