Fork me on Gitee

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查找的数据进行格式化 目的好看一点

 

 

ANDOR寻找

AND

find()方法中,如果通过使用将它们分开传递多个键,则mongodb将其视为AND条件。 以下是AND的基本语法

寻找_id1并且namewscats的所有结果集

db.age.find( { $and: [ {"_id": 1}, {"name": "wscats"} ] } )

OR

在要根据OR条件查询文档,需要使用$or关键字。以下是OR条件的基本语法

寻找namecorrine或者namewscats的所有结果集

 

db.age.find( { $or: [ {"name": "corrine"}, {“name“: "wscats"} ] } )

 

ANDOR等结合

 

相当于语句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 顺序无干系 都是先跳过后限制

 

LimitSkip方法

 

Limit

 

如果你需要在mongodb中读取指定数量的数据记录,可以使用mongodbLimit方法,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写入以下代码,封装自定义模块,方便其他路由复用,注意assertnode自带的断言模块,用于测试代码

 

参考

 

 

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'); }); }) });

 

posted @ 2019-01-12 15:10  修修改改  阅读(321)  评论(0编辑  收藏  举报