MongoDB数据库基本操作
一、用户
1.切换collection
>use admin 则表示切换到admin数据库。
2.创建用户
>db.createUser(
{
user:"username",
pwd:"password",
roles:[{role:"root",db:"admin"}]
}
);
为指定collection创建用户时先使用命令:>use collection_name切换到其中,再创建。
3.查询整个数据库的用户
>db.system.users.find()
查询当前collection的用户
>show users
4.用户认证
>db.auth('username','password')
5.修改密码
>db.changeUserPassword("accountUser", "SOh3TbYhx8ypJPxmt1oOfL")
6.删除用户
①删除单个用户
>db.dropUser("accountUser", {w: "majority", wtimeout: 5000})
②删除所有用户
>db.dropAllUsers( {w: "majority", wtimeout: 5000} )
7.查询用户
①查询某指定用户
>db.getUser("accountUser")
②查询所有用户
>db.getUsers()
8.授予某用户权限
>db.grantRolesToUser(
"accountUser01",
[ "readWrite" , { role: "read", db: "stock" } ],
{ w: "majority" , wtimeout: 4000 }
)
9.移除某用户权限
>db.revokeRolesFromUser( "accountUser01",
[ { role: "read", db: "stock" }, "readWrite" ],
{ w: "majority" }
)
10.更新用户信息
>db.updateUser( "accountUser01",
{
customData : { employeeId : "0x3039" },
roles : [
{ role : "read", db : "assets" }
]
} )
二、数据库和集合
1.创建数据库
>use db_example
2.展示当前使用的数据库:
>db
3.展示所有数据库:
>show dbs
4.创建的新数据库不会出现在数据库列表里,需要先插入一条数据
>db.db_example.insert({"key_test":"value_est"})
6.删除当前数据库
>db.dropDatabase()
7.删除数据库中的collection
>db.collection.drop()
三、增删改查
1.新增
①插入一条:
>db.products.insertOne( { _id: 10, item: "box", qty: 20 } )
②插入多条:
>db.products.insertMany( [ { item: "card", qty: 15 }, { item: "envelope", qty: 20 }, { item: "stamps" , qty: 30 } ] )
③插入一条或多条:
>db.products.insert( { _id: 10, item: "box", qty: 20 } )
>db.products.insert(
[
{ _id: 11, item: "pencil", qty: 50, type: "no.2" },
{ item: "pen", qty: 20 },
{ item: "eraser", qty: 25 }
]
)
④save命令:
新增一条document
>db.products.save( { item: "book", qty: 40 } )
新增一条document,如果_id所指项存在则覆盖原有的,否则直接插入
>db.products.save( { _id: 100, item: "water", qty: 30 } )
2.查询
①在一个collection中查询所有,相当于SELECT * FROM inventory
>db.inventory.find( {} )
查询不存在某字段的项,例如:
>db.inventory.find( { item : { $exists: false } } )
查询某字段为空、或者不存在该项,例如:
>db.inventory.find( { item: null } )
查询存在某字段且为空的项,例如:
>db.inventory.find( { item : { $type: 10 } } )
上面这条查询使用了BSON Type,由此可以看出,MongoDB支持不同数据类型的检索查询。
格式化查询,所有查询命令后都可加pretty(),输出的数据格式更易读,例如:
>db.inventory.find().pretty()
查询结果排序,例如:
>db.inventory.find().sort( { score: -1} )
②按某个条件查询,相当于SELECT * FROM inventory WHERE status = "D"
>db.inventory.find( { status: "D" } )
③条件in查询,相当于SELECT * FROM inventory WHERE status in ("A", "D")
>db.inventory.find( { status: { $in: [ "A", "D" ] } } )
④条件and查询,相当于SELECT * FROM inventory WHERE status = "A" AND qty < 30
>db.inventory.find( { status: "A", qty: { $lt: 30 } } )
⑤条件or查询,相当于SELECT * FROM inventory WHERE status = "A" OR qty < 30
>db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
⑥条件or和and查询,相当于SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
>db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
由此可以看出MongoDB查询支持正则表达式:$regex
④统计某个collection总条数,例如:
>db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )
此命令和命令db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()是等价的。
⑤统计某collection的存储空间,例如:
>db.orders.dataSize()
⑥查看某命令的执行计划,例如:
>db.products.explain().count( { quantity: { $gt: 50 } } )
⑦去重命令,例如:
原数据库中又如下数据:
{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] }
{ "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] }
{ "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" }
{ "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }
>db.inventory.distinct( "dept" )
则显示如下:
[ "A", "B" ]
⑧显示某个collection中的所有索引,例如:
>db.inventory.getIndexes()
⑨复合运算,例如:
原数据库中又如下数据
{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 }
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 }
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 }
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 }
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }
>db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
])
则显示如下:
{ "_id" : "xyz1", "total" : 100 }
{ "_id" : "abc1", "total" : 75 }
⑩数据库达到最大存储时是否自动覆盖旧数据查询,例如:
>db.collection.isCapped()
返回true和false
3.修改
①更新第一条匹配的数据,例如:
>db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
这条命令会将inventory中第一个item为paper的document更新为{}中的内容,即:size.uom=cm, status=P, 赋值lastModified为当前时间,如果lastModified不存在则创建该字段。
②更新多条匹配的数据,例如:
>db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
这条命令将inventory中所有qty<=50的document更新为{}中的内容。
③更新一条或多条匹配的数据,例如:
>db.books.update(
{ stock: { $lte: 10 } },
{ $set: { reorder: true } },
{ multi: true }
)
更新所有stock<=10的匹配数据为reorder=true,因为有选项multi: true存在,multi默认为false,即只修改第一条匹配数据。
④替换一条匹配的数据,例如:
>db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
这条命令会将inventory中第一个item为paper的document更新为中的内容,但是_id字段不会更新;也可以把_id字段放倒下方的{}中,但是必须和原有数据库的一致。也就是说替换命令无论如何不能修改_id字段值。
⑤Other Option
Upsert:
假如updateOne(), updateMany(),update() 或者 replaceOne()包括upsert : true选项,而且指定的条件没有在原有数据库过滤到,比如③中的item=paper,则mongo会生产一条并插入到数据库中;假如存在,则做相应的修改或替换操作。
Multi:
如果update()操作含有multi:true选项,则或修改多条匹配的数据,为false则只修改一条。
$set, $inc,$unset分别为修改、新增和删除字段,例如:
>db.books.update( { _id: 1 }, { $unset: { tags: 1 } } )
4.删除
mongo在执行删除操作时不会删除相应的索引,即使删除某个collection中的所有数据。
①删除某个collection中所有数据,例如:
>db.inventory.deleteMany({})
按条件删除,例如:
>db.inventory.deleteMany({ status : "A" })
②仅删除某个collection中的一个数据,即使条件匹配了多条数据,例如:
>db.inventory.deleteOne( { status: "D" } )
另一个按条件删除:
>db.products.remove( { qty: { $gt: 20 } } )
③另一个删除某个collection中的所有数据,例如:
>db.inventory.remove( { } )
由于此操作仍然保留索引,所以不如使用db.inventory.drop()命令删除表再重新创建表结构和索引更高效。
5.其他
①返回某个collection的统计数据信息,例如:
>db.collection.stats()
②返回分配给某个collection存储数据的空间大小,例如:
>db.collection.storageSize()
③返回分配给某个collection存储索引的空间大小,例如:
>db.collection.totalIndexSize()
④返回分配给某个collection存储数据和索引的空间大小,例如:
>db.collection.totalSize(http://www.amjmh.com)
---------------------