MongoDB 基本操作
2017-07-25 本文已影响0人
一颗北上广的心
Get Started
-
Start mongo server:
-
download mongodb
-
create the folder C:/data/db
-
open a cmd, cd the bin folder of mongodb
-
type "mongod" in cmd to start the server.
-
Open MongoDB Enterprise:
-
open a cmd, cd the bin folder of mongodb
-
type "mongo" in cmd to start the Enterprise
-
MongoDB Enterprise > use admin //create root user
-
create a super admin.
MongoDB Enterprise > use admin //create root user
switched to db admin
MongoDB Enterprise > db.createUser({ user: "root",pwd: "root",customData:{name:"root"},roles:[{ role: "userAdminAnyDatabase",db: "admin" }]})
Then you can use this user login any db in mongo. (use xxx; db.auth('root','root'))
MANAGE
show dbs //show all the databases
show collections //show all the collections of the datebase used
db.stats() //show the info of the database used
db.numbers.stats() // show the info of the collection numbers
db.numbers.getIndexes() //show the indexes of the collection numbers
CREATE DB
MongoDB Enterprise > show dbs
admin 0.000GB
local 0.000GB
MongoDB Enterprise > use tmybang //create db
switched to db tmybang
MongoDB Enterprise > show dbs // you can't see it until you add some data into it
admin 0.000GB
local 0.000GB
MongoDB Enterprise > use tmybang
switched to db tmybang
MongoDB Enterprise > db.users.insert({"id":1,"name":"aaa","age":20,"sex":"f"}) // add some
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > show dbs // you can see it now!
admin 0.000GB
local 0.000GB
tmybang 0.000GB
DROP DB
MongoDB Enterprise > use dbfordelete
switched to db dbfordelete
MongoDB Enterprise > db.users.insert({"id":1,"name":"aaa","age":20,"sex":"f"})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > show dbs // has added a db for delete
admin 0.000GB
dbfordelete 0.000GB
local 0.000GB
tmybang 0.000GB
MongoDB Enterprise > use dbfordelete // choose the db for delete
switched to db dbfordelete
MongoDB Enterprise > db.dropDatabase() // delete it
{ "dropped" : "dbfordelete", "ok" : 1 }
MongoDB Enterprise > show dbs
admin 0.000GB
local 0.000GB
tmybang 0.000GB
COLLECTION OPERATIONS
MongoDB Enterprise > db.createCollection("product.product") //创建普通collection
{ "ok" : 1 }
//capped collection: 无索引, 不可以删除数据,不可以执行任何会增加文档大小的更新操作
MongoDB Enterprise > db.createCollection("cappedCollection",{capped:true,size:9000}) //创建固定大小collection, 超过部分会被最新的覆盖
{ "ok" : 1 }
MongoDB Enterprise > db.cappedCollection.drop()//删除collection
true
MongoDB Enterprise > db.createCollection("cappedCollection",{capped:true,size:9000,max:1000}) //创建固定大小,文档条数collection,超过的部分会被最新的覆盖
{ "ok" : 1 }
MongoDB Enterprise > db.cappedCollection.isCapped() // 判断是否是固定大小集合
true
MongoDB Enterprise > db.foods.isCapped()
false
MongoDB Enterprise > db.runCommand({"convertToCapped":"foods",size:1000}) //将普通的collection转为固定大小collection
{ "ok" : 1 }
INSERT/SAVE
MongoDB Enterprise > db.users.find()
{ "_id" : ObjectId("5971970abd50d9cb81338f84"), "id" : 1, "name" : "aaa", "age" : 20, "sex" : "f" } // there is one at first
MongoDB Enterprise > db.users.insert({"id":2,"name":"bbb","age":10,"sex":"f"}) // insert one
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.users.save({"id":3,"name":"ccc","age":30,"sex":"m"}) // save one
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.users.find() // there are three now
{ "_id" : ObjectId("5971970abd50d9cb81338f84"), "id" : 1, "name" : "aaa", "age" : 20, "sex" : "f" }
{ "_id" : ObjectId("59719e469b902070b598cbc6"), "id" : 2, "name" : "bbb", "age" : 10, "sex" : "f" }
{ "_id" : ObjectId("59719e599b902070b598cbc7"), "id" : 3, "name" : "ccc", "age" : 30, "sex" : "m" }
UPDATE
--update set name='bbb' where id=1(put the whole entity or just set the name)
MongoDB Enterprise > db.users.update({"id":1},{ "id" : 1, "name" : "bbb", "age" : 20, "sex" : "f" })
MongoDB Enterprise > db.users.update({"id":1},{ $set: "name" : "bbb"})
--add new attribute
MongoDB Enterprise > db.users.update({"id":3},{$set:{"foods":["bread","milk"]}})
--add one element to collection attribution if the element not exist
MongoDB Enterprise > db.users.update({"id":3},{$addToSet:{"foods":"meat"}})
--apply addToSet to all the elements in the each collection
MongoDB Enterprise > db.food.update({id:1},{$addToSet:{$each:{"priceHistory":[2,3,6]}}})
--add one element to collection attribution no matter it exist or not
MongoDB Enterprise > db.food.update({id:1},{$push:{priceHistory:2}})
--add all elements to collection attribution
MongoDB Enterprise > db.food.update({id:1},{$pushAll:{priceHistory:[2,3,4,5]}})
--delete the attribute foods
MongoDB Enterprise > db.users.update({"id":3},{$unset:{"foods":1}})
--remove the id of the comments
MongoDB Enterprise > db.food.update({id:1},{$unset:{'comments.id':1}})
-- set price=price+2
MongoDB Enterprise > db.food.update({id:1},{$inc:{price:2}})
--just update the first one mattched
MongoDB Enterprise > db.food.update({price:5},{$set:{name:'potato1'}})
--update all matched
MongoDB Enterprise > db.food.update({price:5},{$set:{name:'potato2'}},false,true)
--if not exist then insert using price and name
MongoDB Enterprise > db.food.update({price:111},{$set:{name:'potato2'}},true)
-- remove the first element in the priceHistory array/ remove the last by 1
MongoDB Enterprise > db.food.update({id:1},{$pop:{priceHistory:-1}})
--rename the column
MongoDB Enterprise > db.food.update({id:1},{$rename:{'comments':'comment'}})
--update priceHistory.0=null
MongoDB Enterprise > db.food.update({id:1},{$unset:{priceHistory.0:1}})
--delete the first element of priceHistory
MongoDB Enterprise > db.food.update({id:1},{$pop:{'priceHistory':-1}})
--delete all 3 from priceHistory
MongoDB Enterprise > db.food.update({id:1},{$pull:{'priceHistory':3}})
--delete all 3 and 4 from priceHistory
MongoDB Enterprise > db.food.update({id:1},{$pullAll:{'priceHistory':[3,4]}})
--find the order item in orders array whose o_id =1, and update the order address($ = the index of the order item found by the query)
MongoDB Enterprise > db.food.update({'id':4,'orders.o_id':1},{$set:{'orders.$.address':"England"}})
--mongo在做大数据更新的时候,会锁表导致其他进程无法访问,所以会暂停更新让出锁一段时间后再锁表更新;但是让出锁可能会导致一致性问题,可以设置atomic参数表明不让锁,一直更新.
MongoDB Enterprise > db.food.update({id:{$lt:10}},{$set:{"weight":1}},false,true,{$atomic:true})
db.collection.update( criteria, objNew, upsert, multi )
update()函数接受以下四个参数:
- criteria : update的查询条件,类似sql update查询内where后面的。
- objNew : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
DELETE
MongoDB Enterprise > db.users.find()
{ "_id" : ObjectId("5971970abd50d9cb81338f84"), "id" : 1, "name" : "bbb", "age" : 20, "sex" : "f" }
{ "_id" : ObjectId("59719e469b902070b598cbc6"), "id" : 2, "name" : "bbb", "age" : 10, "sex" : "f" }
{ "_id" : ObjectId("59719e599b902070b598cbc7"), "id" : 3, "name" : "ccc", "age" : 30, "sex" : "m" }
MongoDB Enterprise > db.users.remove({"id":3}) //delete from users where id=3
WriteResult({ "nRemoved" : 1 })
MongoDB Enterprise > db.users.find()
{ "_id" : ObjectId("5971970abd50d9cb81338f84"), "id" : 1, "name" : "bbb", "age" : 20, "sex" : "f" }
{ "_id" : ObjectId("59719e469b902070b598cbc6"), "id" : 2, "name" : "bbb", "age" : 10, "sex" : "f" }
MongoDB Enterprise > db.users.remove({"name":"bbb"}) //delete from users where name='b'
WriteResult({ "nRemoved" : 2 })
MongoDB Enterprise > db.users.remove({"name":"bbb"},1) //only delete the first one got
MongoDB Enterprise > db.users.remove({}) // truncate users
SELETE
--find all
MongoDB Enterprise > db.users.find()
--find all and show in a better way
MongoDB Enterprise > db.users.find().pretty()
-- only select price
MongoDB Enterprise > db.food.find({},{"price":1})
-- only NOT select price
MongoDB Enterprise > db.food.find({},{"price":0})
--where age=20
MongoDB Enterprise > db.users.find({"age":20})
--where age<20
MongoDB Enterprise > db.users.find({"age":{$lt:20}})
--where age>20
MongoDB Enterprise > db.users.find({"age":{$gt:20}})
--where age>=20
MongoDB Enterprise > db.users.find({"age":{$gte:20}})
--where age!=20 ; can NOT trigger index
MongoDB Enterprise > db.users.find({"age":{$ne:20}})
--where age!=20 and name='ccc'
MongoDB Enterprise > db.users.find({"age":{$ne:20},"name":"ccc"})
--where name='bbb' or name='ccc'
MongoDB Enterprise > db.users.find({$or:[{"name":"ccc"},{"name":"bbb"}]})
--(name='bbb' or name='ccc') and sex='m'
MongoDB Enterprise > db.users.find({$or:[{"name":"bbb"},{"name":"ccc"}],"sex":"m"})
--only return sex
MongoDB Enterprise > db.users.find({"age":10},{"sex":1})
--name like s%
MongoDB Enterprise > db.users.find({"name":/^s/})
--name NOT like s%
MongoDB Enterprise > db.users.find({"name":{$not:/^s/}})
--like %s%
MongoDB Enterprise > db.users.find({"name":/s/})
--id in (2,3)
MongoDB Enterprise > db.users.find({id:{$in:[2,3]}})
--id not in (2,3) can NOT trigger index.
MongoDB Enterprise > db.users.find({id:{$nin:[2,3]}})
--priceHistory has 1 and 3
MongoDB Enterprise > db.food.find({priceHistory:{$all:[1,3]}})
{ "_id" : ObjectId("5994fe25c3600b69c45b6915"), "_class" : "com.test.Food", "id" : 1, "name" : "rice", "price" : 1, "priceHistory" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("5994fe25c3600b69c45b6917"), "_class" : "com.test.Food", "id" : 3, "name" : "milk", "price" : 3, "priceHistory" : [ 1, 3, 4 ] }
-- find the data which have priceHistory
MongoDB Enterprise > db.food.find({priceHistory:{$exists:true}})
--同上
MongoDB Enterprise > db.food.find({priceHistory:{$ne:null}})
-- can use the attribute as POJO
MongoDB Enterprise > db.food.find({"comments.id":1}).pretty()
{
"_id" : ObjectId("5994fe25c3600b69c45b6915"),
"_class" : "com.test.Food",
"id" : 1,
"name" : "rice",
"price" : 1,
"priceHistory" : [
1,
2,
3
],
"comments" : {
"id" : 1,
"content" : "good"
}
}
// price history array contains 1
MongoDB Enterprise > db.food.find({"priceHistory":1})
{ "_id" : ObjectId("5994fe25c3600b69c45b6915"), "_class" : "com.test.Food", "id" : 1, "name" : "rice", "price" : 1, "priceHistory" : [ 1, 2, 3 ], "comments" : { "id" : 1, "content" : "good" } }
{ "_id" : ObjectId("5994fe25c3600b69c45b6917"), "_class" : "com.test.Food", "id" : 3, "name" : "milk", "price" : 3, "priceHistory" : [ 1, 3, 4 ] }
//price history array[0] = 1
MongoDB Enterprise > db.food.find({"priceHistory.0":1})
{ "_id" : ObjectId("5994fe25c3600b69c45b6915"), "_class" : "com.test.Food", "id" : 1, "name" : "rice", "price" : 1, "priceHistory" : [ 1, 2, 3 ], "comments" : { "id" : 1, "content" : "good" } }
{ "_id" : ObjectId("5994fe25c3600b69c45b6917"), "_class" : "com.test.Food", "id" : 3, "name" : "milk", "price" : 3, "priceHistory" : [ 1, 3, 4 ] }
-- find the food whose priceHistory.size is 3
MongoDB Enterprise > db.food.find({"priceHistory":{$size:3}})
// find the food which has the priceHistoryItem that xxx is 1 and yyy is 2.
MongoDB Enterprise > db.food.find({"priceHistory":{$elemMatch:{xxx:1,yyy:2}}})
--price%3=0, can NOT trigger index
MongoDB Enterprise > db.food.find({"price":{$mod:[3,0]}})
--get data with the first priceHistory
MongoDB Enterprise > db.food.find({},{"priceHistory":{$slice:1}})
--get data with the last priceHistory
MongoDB Enterprise > db.food.find({},{"priceHistory":{$slice:-1}})
--get data with the priceHistory index between 1 and 2
MongoDB Enterprise > db.food.find({},{"priceHistory":{$slice:[1,2]}})
--priceHistory 树组中包含1的
MongoDB Enterprise > db.food.find({"priceHistory":1})
--priceHistory[0]=1
MongoDB Enterprise > db.food.find({"priceHistory.0":1})
--mongo always sort -> skip -> limit
--get the first one
MongoDB Enterprise > db.users.find().limit(1)
--get the second one
MongoDB Enterprise > db.users.find().skip(1).limit(1)
--order by id asc
MongoDB Enterprise > db.users.find().sort({"id":1})
--order by id desc
MongoDB Enterprise > db.users.find().sort({"id":-1})
CREATE INDEX
//create unique index
MongoDB Enterprise > db.food.ensureIndex({id:1},{unique:true})
// craete union index
MongoDB Enterprise > db.users.ensureIndex({"id":1,"name":1})
//create index background to enable CRUD while creating index
MongoDB Enterprise > db.food.ensureIndex({id:1},{background:true})
//recreate all indexes
MongoDB Enterprise > db.food.reIndex()
//explain search
db.users.find().explain(true)
MongoDB Enterprise > db.users.getIndexes() //查看索引
MongoDB Enterprise > db.users.dropIndex({"cardno":1})//删除索引
AGGREGATE
MongoDB Enterprise > db.users.aggregate([{$group :{_id:"$age", result:{$sum:1}}}]) // select age, count(1) from users group by age
{ "_id" : 20, "result" : 2 }
{ "_id" : 40, "result" : 1 }
{ "_id" : 10, "result" : 1 }
MongoDB Enterprise > db.users.aggregate([{$group :{_id:"$age", result:{$avg:"$id"}}}]) //select age, avg(id) from users group by age
{ "_id" : 20, "result" : 2.5 }
{ "_id" : 40, "result" : 3 }
{ "_id" : 10, "result" : 2 }
MongoDB Enterprise > db.users.aggregate([{$group :{_id:"$age", result:{$min:"$id"}}}]) //select age, min(id) from users group by age
{ "_id" : 20, "result" : 1 }
{ "_id" : 40, "result" : 3 }
{ "_id" : 10, "result" : 2 }
MongoDB Enterprise > db.users.aggregate([{$group :{_id:"$age", result:{$max:"$id"}}}]) //select age, max(id) from users group by age
{ "_id" : 20, "result" : 4 }
{ "_id" : 40, "result" : 3 }
{ "_id" : 10, "result" : 2 }
-- select distinct(price) from food where price>3
MongoDB Enterprise > db.food.distinct("price",{price:{$gt:3}})
copy
https://www.w3cschool.cn/mongodb/mongodb-sharding.html
分片
backup
monitor
PS
- 自动补全命令: 连续按两个TAB可自动补全命令
- 查看mongo原码, 输入不带括号的命令即可, eg:
MongoDB Enterprise > db.collection.find
function (query, fields, limit, skip, batchSize, options) {
var cursor = new DBQuery(this._mongo,
this._db,
this,
this._fullName,
this._massageObject(query),
fields,
limit,
skip,
batchSize,
options || this.getQueryOptions());
var connObj = this.getMongo();
var readPrefMode = connObj.getReadPrefMode();
if (readPrefMode != null) {
cursor.readPref(readPrefMode, connObj.getReadPrefTagSet());
}
var rc = connObj.getReadConcern();
if (rc) {
cursor.readConcern(rc);
}
return cursor;
}