1.安装
最新版本为4.0.6,装完可以执行mongo -version查看
下载tar包,解压完
确实够简洁呀,就bin目录,然后在/etc/profile配下环境变量source下就ok!
创建db目录
mkdir -p /data/db
官网还让创建/var/lib/mongo和/var/log/mongo,创建完启动发现这俩目录也没写入数据。
2.启动
临时启动
mongod
看到等待端口连接就ok了,貌似3.2以后不提供web ui界面了,28017端口无法访问了。
可以下载一个RoBo 3T,供可视化。
默认外网无法连接,可以临时启动时,加--bind_ip_all,或者--bind_ip <address>指定ip
mongod --bind_ip_all
也可以创建配置文件,然后启动的时候
mongod -f 配置文件
后台启动
nohup或者&
3.与mysql对比
官网截的图,mongo的collection就是mysql的table,document文档就是row,
而field字段就是column,都是三层结构。
下面是RoBo 3T的截图
类似json数据,每个文档document都有一个类型为ObjectId的_id。
4.mongo的curd
1.查看数据库
show dbs
2.查看当前数据库
db
3.进入某个数据库/如果不存在,新建
use dbName
库无数据的话,此时show dbs,看不到该库
4.查看库的collection
show collections
5.创建collection
collection刚创建无数据时,show collections,看不到该collection
db.newCollection
6.插入数据
db.newCollection.insertOne({x:1})
7.插入多条
db.zlq.insertMany([
// MongoDB adds the _id field with an ObjectId if _id is not present
{ item: "journal", qty: 25, status: "A",
size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
{ item: "notebook", qty: 50, status: "A",
size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
{ item: "paper", qty: 100, status: "D",
size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
{ item: "planner", qty: 75, status: "D",
size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
{ item: "postcard", qty: 45, status: "A",
size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]);
8.查collection所有数据
db.zlq.find( {} )
9.过滤
db.zlq.find( { status: "D" } )
//select * from zlq where status="D"
10.匹配嵌入的document/类似json数组的小json
db.zlq.find( { size: { h: 14, w: 21, uom: "cm" } } )
11.匹配嵌入document的字段
db.zlq.find( { "size.uom": "in" } )
12.匹配数组里的字段
db.zlq.find( { tags: "red" } )
13.匹配数组
db.zlq.find( { tags: ["red", "blank"] } )
//这样的话tags:["red","blank","blue"]匹配不到
14.删库/删collection
db.dropDatabase()
db.zlq.drop()
15.删document
db.zlq.deleteOne({status:"D"})//只删除一行,即使多行符合
db.zlq.deleteMany({status:"A"})
5.mongo的aggregation
db.zlq.aggregate([ {$group:{_id:"$status",total:{$sum:"$qty"}}}])
//select status,sum(qty) from zlq group by status
mongo的mapreduce
对于熟悉hadoop的,就很容易理解了。
官网截的图,首先将每条数据map成key,value,hadoop的话,执行reduce相同的key会聚合成
key,Iterator(value),mongo的话是key,Array(value),然后执行sum
先过滤,再map-->reduce
distinct,返回一个数组
6.与mysql curd对比
<1>create&alter
sql | mongob |
CREATE TABLE people ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) ) | db.people.insertOne( { user_id: "abc123", age: 55, status: "A" } ) db.createCollection("people") |
ALTER TABLE people ADD join_date DATETIME | db.people.updateMany( { }, { $set: { join_date: new Date() } } ) |
ALTER TABLE people DROP COLUMN join_date | db.people.updateMany( { }, { $unset: { "join_date": "" } } ) |
CREATE INDEX idx_user_id_asc ON people(user_id) | db.people.createIndex( { user_id: 1 } ) |
CREATE INDEX idx_user_id_asc_age_desc ON people(user_id, age DESC) | db.people.createIndex( { user_id: 1, age: -1 } ) |
DROP TABLE people | db.people.drop() |
<2>insert
INSERT INTO people(user_id, age, status) VALUES ("bcd001", 45, "A") | db.people.insertOne( { user_id: "bcd001", age: 45, status: "A" } ) |
<3>select
SELECT * FROM people | db.people.find() |
SELECT id, user_id, status FROM people | db.people.find( { }, { user_id: 1, status: 1 } ) |
SELECT user_id, status FROM people | db.people.find( { }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT * FROM people WHERE status = "A" | db.people.find( { status: "A" } ) |
SELECT user_id, status FROM people WHERE status = "A" | db.people.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT * FROM people WHERE status != "A" | db.people.find( { status: { $ne: "A" } } ) |
SELECT * FROM people WHERE status = "A" AND age = 50 | db.people.find( { status: "A", age: 50 } ) |
SELECT * FROM people WHERE status = "A" OR age = 50 | db.people.find( { $or: [ { status: "A" } , { age: 50 } ] } ) |
SELECT * FROM people WHERE age > 25 | db.people.find( { age: { $gt: 25 } } ) |
SELECT * FROM people WHERE age < 25 | db.people.find( { age: { $lt: 25 } } ) |
SELECT * FROM people WHERE age > 25 AND age <= 50 | db.people.find( { age: { $gt: 25, $lte: 50 } } ) |
SELECT * FROM people WHERE user_id like "%bc%" | db.people.find( { user_id: /bc/ } ) -or- db.people.find( { user_id: { $regex: /bc/ } } ) |
SELECT * FROM people WHERE user_id like "bc%" | db.people.find( { user_id: /^bc/ } ) -or- db.people.find( { user_id: { $regex: /^bc/ } } ) |
SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC | db.people.find( { status: "A" } ).sort( { user_id: 1 } ) |
SELECT * FROM people WHERE status = "A" ORDER BY user_id DESC | db.people.find( { status: "A" } ).sort( { user_id: -1 } ) |
SELECT COUNT(*) FROM people | db.people.count() or db.people.find().count() |
SELECT COUNT(user_id) FROM people | db.people.count( { user_id: { $exists: true } } ) or db.people.find( { user_id: { $exists: true } } ).count() |
SELECT COUNT(*) FROM people WHERE age > 30 | db.people.count( { age: { $gt: 30 } } ) or db.people.find( { age: { $gt: 30 } } ).count() |
SELECT DISTINCT(status) FROM people | db.people.aggregate( [ { $group : { _id : "$status" } } ] ) or, for distinct value sets that do not exceed the BSON size limit db.people.distinct( "status" ) |
SELECT * FROM people LIMIT 1 | db.people.findOne() or db.people.find().limit(1) |
SELECT * FROM people LIMIT 5 SKIP 10 | db.people.find().limit(5).skip(10) |
EXPLAIN SELECT * FROM people WHERE status = "A" | db.people.find( { status: "A" } ).explain() |
<4>update
UPDATE people SET status = "C" WHERE age > 25 | db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } } ) |
UPDATE people SET age = age + 3 WHERE status = "A" | db.people.updateMany( { status: "A" } , { $inc: { age: 3 } } ) |
<5> delete Records
DELETE FROM people WHERE status = "D" | db.people.deleteMany( { status: "D" } ) |
DELETE FROM people | db.people.deleteMany({}) |