前言:你们这些不好好写接口的后台,非要逼着前端一统天下。纯属开玩笑哈,第一次写跟后台相关的东西,当揭开后台神秘的面纱的时候,那种惊喜、开心、成就感让我重回当初写出第一个hello world的时候。
由于我是用的是win10系统就以windows为基础说啊,linux和mac os的自行解决哈,不过应该也是大同小异的。
1. 安装
mongodb的下载和安装就不说了啊,还没有下载安装的自行去Mongodb 官网下载安装即可。
2.创建data
这部分内容主要参考 NodeJS+Express+MongoDB 的文章,我主要说一下踩到的坑和遇到的错误处理
安装好之后,在根目录下创建data文件夹,我是放在e盘里的。
e:\data\db用于存放mongodb的数据文件
e:\data\log用于存放mongodb的日志文件
错误处理
1. 使用net start mongodb命令启动MongoDB服务发生系统错误,返回值为5
解决方法:cmd使用管理员身份打开即可,到C:\Windows\System32找到cmd.exe然后以管理员的身份运行。为了避免每次启 动都要查找一次cmd文件,我把cmd放在了开始菜单里,右键固定在开始菜单就好了。
2. 使用net start mongodb命令启动mongodb系统出错。 发生系统错误 1067。 进程意外终止。
解决方法:MongoDB安装目录\data\将此文件夹下的mongod.lock删除,我没有遇到这个问题,也不知道能不能正确解决,有踩过坑的可以说一下。
3. 使用net stop mongodb命令启动mongodb系统出错。 发生系统错误 1067。 进程意外终止。
我在start的时候是正常启动的,但是在stop的时候报错了,但是最后还是正常stop了,上面所说的mongod.lock或者mongod.cfg我都没有,也不知道如何解决,知道怎么解决的大佬还请赐教,谢谢,鞠躬鞠躬!
注:解决了之后一定要重启服务才会生效哦。
3.启动
还是继续参考上一边文章
1.命令行
## 开始服务
net start mongodb
## 停止服务 nginxstop并不会关闭服务,需要使用kill,事实证明win10下stop是可以正常停止服务的
net stop mongodb
2.在mongodb的安装目录下,E:\Program Files\MongoDB\Server\3.4\bin 下的mongo.exe文件 ,也可以放在开始里面,右键固定在开始菜单就好了
3.可视化工具robomongo
下载传送门 选择 Robo 3T 即可,选择第二个绿色版本即可,下载下来解压直接运行.exe文件就可以了,当然了这个也可以放在开始,右键固定在开始菜单就好了。
4.管理员
参考 NodeJS入门——准备工作(2)——MongoDB安装以及客户端Robomongo安装和使用
1.重新打开一个命令行窗口,切换到Mongodb安装路径下bin文件夹内
2.输入命令: mongo,输入命令 use admin切换到admin数据库
3.输入命令 db.addUser('admin','admin') 添加管理员账户 这是以前的版本
新版本应使用 ad.createUser({user:"admin",pwd:"admin",roles:[]})
新版本的命令参考
5.数据库操作
使用robo3T robomongo工具
1.创建和删除数据库
可以使用图形界面右键create database创建数据库,右键Drop Database删除数据库
也可以使用命令行来操作:
1.创建数据库gomall: use gomall
db
2.删除数据库gomall:use gomall
db.dropDatabase()
2.数据库操作命令:
先打开shell脚本编写界面
1.insert:
命令:db.表名.insert(数据);
例子:db.products.insert({name:"iphone",price:1988});
说明:insert操作会自动创建products表,_id,是mongodb自已生成的,每行数据都会存在,默认是ObjectId,可以在插入数据时插入这个键的值(支持mongodb支持的所有数据类型)
查看数据:db.getCollection('products').find({});
3.2 版本后还有以下几种语法可用于插入文档:
db.collection.insertOne():向指定集合中插入一条文档数据
db.collection.insertMany():向指定集合中插入多条文档数据
2.save
命令:db.表名.save.(数据);
例子:db.proctus.save({_id:2,name:"HuaWei P10",price:2999});
说明:_id可以自已插入、一个表中不一定要字段都相同,虽然insert和save方法都可以插入数据,当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息。
3.批量添加
for(var i = 0; i < 5; i ++) db.users.save({'_id':i,'name':'zhangguo'+i,'age':i+8});
for(let i = 0; i < 5; i ++) db.users.save({'_id':i,'name':`zhangguo${i}`,'age':i+8});
4.查询数据
1.查询集合中所有数据
命令: db.集合.find();
例子:db.users.find({name:'zhangguo0'});
db.getCollection('users').find({});
db.users.find({});
db.users.find();
其中,例子的后面三种写法是相同的结果
2.按条件查询(支持多条件)
命令:db.集合.find(条件);
例子:db.users.find({name:'zhangguo0',age:9})
说明:对象中的条件要求同时成立
3.查询第一条(支持条件)
命令:db.集合.findOne(条件);
例子:db.users.findOne({name:'zhangguo0'});
4.限制数量
命令: db.集合.find().limit(数量);
例子: db.users.find({}).limit(3); 或 db.users.find().limit(3); 结果一样
5.跳过指定数量
命令: db.表名.find().skip(数量);
例子: db.users.find({}).skip(3);
db.users.find({}).skip(2).limit(2);
6.比较查询
不同类型不会作比较,string和number不会作比较
比较查询的语法参考
1.等于:$eq
格式:{<key>:<value>}
{<key>:{$eq:<value>}}
例子:db.users.find({age:10});
db.users.find({age:{$eq:10}});
说明:这两种格式的结果是一样的
2.大于: $gt
格式:{<key>:{$gt:<value>}}
例子:db.users.find({age:{$gt:10}});
3.大于等于: $gte
格式:{<key>:{$gte:<value>}}
例子:db.users.find({age:{$gte:10}});
4.小于: $lt
格式:{<key>:{$lt:<value>}}
例子:db.users.find({age:{$lt:10}});
5.小于等于: $lte
格式:{<key>:{$lte:<value>}}
例子:db.users.find({age:{$lte:10}});
6.不等于: $ne
格式:{<key>:{$ne:<value>}}
例子:db.users.find({age:{$ne:10}});
7.查询数量
语法:db.表名.find().count();
例子:db.users.find({}).count()
8.排序
语法:db.表名.find().sort({"字段名":1});
例子:db.users.find({}).sort({}) 不能写成db.users.find({}).sort()会报错 "Failed to parse: sort: undefined. 'sort' field must be of BSON type object."
db.users.find({}).sort({age:-1,name:1});
说明:1:表示升序;-1:表示降序;db.users.find({}).sort({}) 什么都不传按默认排序,默认是_id升序排序
9.指定字段返回
语法:db.表名.find({},{"字段名":0});
例子:db.users.find({age:{$gt:9}},{_id:0,age:1,name:1});
说明: 参数 1:返回 0:不返回
5.修改
1.修改符合条件的第一条:update
语法:db.集合.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});
例子:db.users.update({age:{$eq:9}},{$set:{age:100}});
db.users.update({age:9},{$set:{age:100}});
说明:这两种格式的例子结果是一样的。前面save在_id字段已存在是就是修改操作。
2.修改多条:updateMany
例子: db.users.updateMany({age:{$gt:10}},{$set:{age:20}});
6.删除
语法:db.集合.remove(条件);
例子:db.users.remove({age:{$gte:10}}); // 删除年龄>=10岁的数据
6.node.js访问Mongodb
前提:先用nodejs新建一个简单的项目
在当前项目中引入mongodb,可以不用全局安装的。
npm install mongodb --save
在项目的根目录下新建一个db.js文件,使用Node.js操作MongoDB。写完之后运行 node db.js 即可。
下面附上Node.js操作MongoDB的完整代码。主要主义的点是2.x和3.0以上的版本api接口有一点出入
// 引入客户端mongodb模块,获得客户端对象
const MongoClient = require('mongodb').MongoClient;
// 连接字符串
const DB_CONN_STR = 'mongodb://localhost:27017/gomall';
// 添加数据
const insertData = function (db, callback) {
// 获得指定的集合
let collection = db.collection('users');
// 插入数据
let data = [{
_id: 9,
name: 'rose',
age: 23
}, {
_id: 10,
name: 'mark',
age: 24
}];
// collection.insert(data, function (err, result) { // mongodb 2.x的写法
collection.insertMany(data, function (err, result) {
// 如果存在错误
if (err) {
console.error('Error:', err);
return;
}
// 调用传入的回调方法,将操作结果返回
callback(result);
});
}
// 修改数据
const updateData = function (db, callback) {
// 获得指定的集合
let collection = db.collection('users');
// 要修改数据的条件,>=10岁的用户
let where = {
age: {
$gte: 10
}
};
// 要修改的结果
let set = {
$set: {
age: 95
}
};
collection.updateMany(where, set, function (err, result) {
// 如果存在错误
if (err) {
console.error('Error:', err);
return;
}
// 调用传入的回调方法,将操作结果返回
callback(result);
})
}
// 查询数据
const findData = function (db, callback) {
let collection = db.collection('users');
let where = {
age: {
$eq: '22'
}
};
let set = {
name: 1,
age: 1
};
collection.find(where, set).toArray(function (err, result) {
if (err) {
console.error('Error:', err);
return;
}
callback(result);
});
// 删除数据
const deleteData = function (db, callback) {
let collection = db.collection('users');
let where = {
age: {
$eq: '21'
}
};
collection.remove(where, function (err, result) {
if (err) {
console.error('Error:', err);
return;
}
console.log(result);
callback(result);
})
}
}
//使用客户端连接数据,并指定完成时的回调方法
// MongoClient.connect(DB_CONN_STR, function (err, db) { // 2.x的写法
MongoClient.connect(DB_CONN_STR, {
useNewUrlParser: true
}, function (err, client) { 3.0的写法
if (err) {
console.error('数据库连接失败');
return;
}
console.log('连接成功');
// 执行插入数据操作,调用自定义方法
let db = client.db('gomall'); // 3.0的写法
insertData(db, function (result) {
// 显示结果
console.log(result);
// 关闭数据库
client.close();
});
updateData(db, function (result) {
// 显示结果
console.log(result);
client.close();
});
findData(db, function (result) {
console.log(result);
client.close();
});
deleteData(db, function (result) {
console.log(result);
client.close();
})
});
感谢:
1. https://www.cnblogs.com/best/p/6212807.html
2.https://www.cnblogs.com/zhaord/p/4229001.html
3.https://blog.csdn.net/u010523770/article/details/54599548
4.http://www.runoob.com/mongodb/mongodb-query.html
是你们在我黑暗的路上打开了一盏路灯,谢谢!
以上就是我的踩坑记录,愿对你也有所帮助。
愿圣光与你同在