MongoDB是由 C++ 编写的基于分布式文件存储的非关系型数据库(NoSQL),将数据存储为一个文档,数据结构由键值(key=>value)对组成,类似于 JSON 对象。MongoDB 与其他关系型数据库相比,关系型数据库必须创建表和字段,否则无法使用,但是mongodb属于“无状态模式”,结构不需要设计,会自动创建数据库和集合,直接使用即可,存什么东西取决于我们自己向他传入什么(当不存在则创建,不需要手动去创建)。MongoDB 数据存储量大时,丢失率较高,适合存储一些不太重要的信息。市面上用MongoDB的有纽约时报、优酷视频等。
安装MongoDB
以 Windows 10 操作系统为例,安装MongoDB。
- 去官网 https://www.mongodb.com/downl... 下载客户端,这里下载的是 mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi 。
- 安装在 C:Program FilesMongoDBServer3.2bin 目录下。
- 添加系统环境变量:此电脑=>属性=>高级系统设置=>环境变量=>系统变量=>Path=>新建=>C:Program FilesMongoDBServer3.2bin 。
- 在 D 盘创建 mongodb-data 文件夹。
- 在 C:Program FilesMongoDBServer3.2bin 目录下运行
$ mongod --dbpath D:\mongodb-data
。 - 批处理: 新建文件 mongod批处理命令.bat ,内容为 mongod --dbpath D:mongodb-data 或为 C:Program FilesMongoDBServer3.2binmongod --dbpath D:mongodb-data 。点击运行即可。
- 安装 NoSQL Manager for MongoDB 。 https://www.mongodbmanager.co... 下载免费版安装。
MongoDB的API
假设存在数据库 shop 有集合 goods。
$ mongo
$ show dbs
$ use shop
-
$ db.goods.find()
查询 -
$ db.goods.findOne()
查询一条数据 -
$ db.goods.find({"name": "XXX"})
查询name为XXX的所有数据 -
$ db.goods.find({"name": "XXX"},{"_id": 0})
查询结果不显示 _id -
$ db.goods.find({"name": /X/})
查询name包括X的数据 -
$ db.goods.find({"name":/米/},{"name":1}).limit(3)
查询结果只显示name的3条数据 -
$ db.goods.find({"price": {"$gte":25,"$lte":27})
查询price在25-27之间的数据 -
$ db.goods.find({"country":{"$ne": "China"}})
查询country不是China的数据 -
$ db.goods.insert({"name": "XXX"})
增加{"name": "XXX"}这条数据 -
$ db.googs.remove({/* 查询条件 */})
删除 -
$ db.goods.update({/* 查询条件 */},{"$set": {"name": "newName"})
更新 $ db.goods.count({/* 查询条件 */}
其他查询条件
-
{"country": {"$in": ['China', 'USA']}
country是数组的某一个,相反就是$nin
-
{"$or":[{"c":{"$gte":85}},{"e":{"$gte":90}}]}
c>85或者e>90 -
{"color":{"$all":["red","black"]}}
color有red和black,两者都有 -
{"name":{"$not":/li/i}
name不存在li,$not 可以反正任何地方取反 -
{"books.1":"JS"}
books是数组,第二项是JS -
{"area.province":"sc"}
area是对象,属性province是sc -
{"books":{"$size":4}}
books的长度为4
备份与还原
- 把shop备份到D:data:
$ mongodump -h 127.0.0.1:27017 -d shop -o D:\data
- 从D:data还原shop:
mongorestore -h 127.0.0.1:27017 -d shop D:\data
导入数据
另起命令行,不是在mongo里面 $ mongoimport --db mydbs --collection product --drop --file
file是导入json文件的路径(),注意--drop是先删除后导入,也可以不用--drop不删除直接导入。
Nodejs操作MongoDB
const MongoClient = require('mongodb').MongoClient;
const express = require("express");
const app = express();
const dbName = "mongodb://localhost:27017"; // mongodb的默认端口是27017
// connect --> insert、remove、update、find -->close
app.get("/", (req, res) => {
MongoClient.connect(dbName, (err, db) => {
if (err) { // err为一串错误,db为null
console.log("连接失败");
return;
}
// 否则就是err为null,db为一串数据
console.log("连接成功");
// 在mydata的bbs集合(表)中插入一条数据,不存在bbs则创建
db.db("mydata").collection("bbs").insertOne({
"name": "myfirst"
}, (err, result) => {
if (err) {
console.log("数据库写入失败");
return;
}
console.log("成功插入");
db.close();
});
});
res.end();
});
app.listen(3000);
有参数的
const MongoClient = require('mongodb').MongoClient
const express = require('express')
const app = express()
const dbName = 'mongodb://localhost:27017'
app.set('view engine', 'ejs');
app.get('/add', (req,res)=>{
res.render('add'); // views目录下的add.ejs
})
app.get('/manage',(req,res)=>{
let {name, age, sex} = req.query;
MongoClient.connect(dbName,(err,db)=>{
if(err)return;
res.writeHead(200,{'Content-type': 'text/html;charset=utf-8'});
res.write('连接数据库成功');
db.db('dnedu').collection('bbs').insertOne({name,age,sex},(err,result)=>{
if(err)return;
res.end();
db.close();
})
})
})
app.listen(80);
<!--views/add.ejs-->
<form action="/manage" method="get">
<p>姓名:<input type="text" name="name" /></p>
<p>年龄:<input type="text" name="age" /></p>
<p>性别:<input type="text" name="sex" /></p>
<p><input type="submit" value="提交" /></p>
</form>
数据变化可在 NoSQL Manager for MongoDB 查看。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。