MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值对(key => value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。
先用mongod创建mongoDB服务器,再用mongo调用后台管理。
下载安装完MongoDB后,按照教程输入命令。
mongod.exe --dbpath e:\data\db
出现错误码100,看了错误解释,里面有个options: { storage: { dbPath: "e:datadb" } }
可以看到路径错误,所以在git命令里,应该不是反斜杠’\’而是斜杠’/’。
继续运行mongod.exe --dbpath e:/data/db
,这回数据库路径是没有问题了,但是又出现了另外一个警告。
Access control is not enabled for the database.
Read and write access to data and configuration is unrestricted.
出现这个警告的原因是新版本的MongoDB为了让我们创建一个安全的数据库必须要进行认证。
解决方法如下:
1.创建管理员
use admin
db.createUser(
{
user: "userAdmin", //用户名
pwd: "123", //密码
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] //权限
}
)
2.重启MongoDB服务器
mongod --auth --port 27017 --dbpath <关联路径>
3.连接并认证
mongo --port 27017 -u "userAdmin" -p "123" --authenticationDatabase "admin"
这样MongoDB更新了,使用mongoose也不能简单的建立连接了,必须添加必要参数
var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'test', 27017, {user: 'tester', pass: '123'})
SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键
一些简单命令
show dbs
看到所有数据库
db
当前数据库
use
连接到一个指定的数据库
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
db.dropDatabase()
默认删除当前数据库。
db.collection.drop()
集合删除语法。
实例
> use runoob
switched to db runoob
> show tables
site
> db.site.drop()
true
> show tables
>
db.createCollection(name, options)
创建集合。
Name,string类型,要创建的集合名称。
Options,document类型,可以指定内存大小和索引选项。
Options
参数 | 类型 | 描述 |
---|---|---|
capped | Boolean | (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true,则需要也指定尺寸参数。 |
autoIndexID | Boolean | (可选)如果为true,自动创建索引_id字段的默认值是false。 |
size | number | (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。 |
max | number | (可选)指定封顶集合允许在文件的最大数量。 |
db.COLLECTION_NAME.drop()
MongoDB使用insert()或save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
以下文档可以存储在MongoDB的runoob数据库的col集合中。
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
如果没有该集合,自动创建并插入文档。
查看已插入文档:
> db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
>
如果不指定_id字段save()方法类似于insert()方法,如果指定_id字段,则会更新该_id的数据。
MongoDB使用update()和save()方法来更新集合中的文档。接下来让我们详细看下两个函数的应用和区别。
update()方法
update()方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
save()方法
save()方法通过传入的文档来替换已有文档。语法格式如下:
db.collection.save(
<document>,
{
writeConcern:
}
)
参数说明:
document : 文档数据。
writeConcern :可选,抛出异常的级别。
MongoDB remove()函数是用来移除集合中的数据。
MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确。
语法格式如下:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
MongoDB查询文档使用find()方法。
find()方法以非结构化的方式来显示所有文档。
语法:
db.collection.find(query, projection)
MongoDB与RDBMS Where语句比较
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {:} | db.col.find({“by”:”菜鸟教程”}).pretty() | where by = ‘菜鸟教程’ |
小于 | {:{lt: |
where likes < 50 | |
小于或等于 | {:{lte: |
where likes <= 50 | |
大于 | {:{gt: |
where likes > 50 | |
大于或等于 | {:{gte: |
where likes >= 50 | |
不等于 | {:{ne: |
where likes != 50 |
MongoDB里的 AND条件
db.col.find({key1:value1, key2:value2}).pretty()
实例:
> db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
MongoDB OR 条件
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
举个例子
db.col.find({"likes" : {$gt : 100}})
$gt -------- greater than
$gte --------- gt equal
$lt -------- less than
$lte --------- lt equal
$ne ----------- not equal
db.col.find({"title" : {$type : 2}})
字符串类型的标题
用法:>db.COLLECTION_NAME.find().limit(NUMBER)
指定显示的记录数量,如果没有则显示集合中的所有数据。
接收一个数字参数作为跳过的记录条数。
语法:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
注:Skip()和Limit()结合可以使用分页。
在MongoDB中使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1适用于降序排列。
>db.COLLECTION_NAME.find().sort({KEY:1})
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫面集合中的每个文件并选取哪些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别是在处理大量的数据时,查询可能需要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或者多了的值进行排序的一种结构。
ensureIndex()
MongoDB中聚合主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
aggregate()方法
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
在项目中使用cnpm install mongodb
安装
接下来实现增删改查功能。
数据库操作( CURD )
与MySQL不同的是MongoDB会自动创建数据库和集合,所以使用前我们不需要手动去创建。
以下实例我们连接数据库runoob的site表,并插入两条数据:
var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/runoob';
var insertData = function(db, callback) {
// 连接到表site
var collection = db.collection('site');
// 插入数据
var data = [
{"name": "菜鸟教程", "url": "www.runoob.com"},
{"name":"菜鸟工具","url":"c.runoob.com" }
];
collection.insert(data, function(err, result) {
if (err) {
console.log(err);
return;
}
callback(result);
})
};
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log('连接成功');
insertData(db, function(result) {
console.log(result);
db.close()
})
})
查询数据
var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/runoob';
var selectData = function(db, callback) {
//连接到表
var collection = db.collection('site');
//查询数据
var whereStr = {"name":'菜鸟教程'};
collection.find(whereStr).toArray(function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
selectData(db, function(result) {
console.log(result);
db.close();
});
});
var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/runoob';
var updateData = function(db, callback) {
//连接到表
var collection = db.collection('site');
//更新数据
var whereStr = {"name":'菜鸟教程'};
var updateStr = {$set: { "url" : "https://www.runoob.com" }};
collection.update(whereStr,updateStr, function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
updateData(db, function(result) {
console.log(result);
db.close();
});
});
var MongoClient = require('mongodb').MongoClient;
var DB_CONN_STR = 'mongodb://localhost:27017/runoob';
var delData = function(db, callback) {
//连接到表
var collection = db.collection('site');
//删除数据
var whereStr = {"name":'菜鸟工具'};
collection.remove(whereStr, function(err, result) {
if(err)
{
console.log('Error:'+ err);
return;
}
callback(result);
});
}
MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log("连接成功!");
delData(db, function(result) {
console.log(result);
db.close();
});
});