mongodb 基本操作 CRUD
一,mongodb 基本操作
创建数据库
语法: use databaseName ,如果有该数据库就切换到该数据库。没有则创建该数据库
例子: use runoob , runoob 如果有这个数据库就切换到这个数据库,没有则创建
输出 > switched to db runoob
这个创建数据库时直接使用 show dbs (查看数据库)是看不到的,需要插入一些数据才会看见
删除数据库
删除数据库时需要先切换到需要删除的数据库例:
> use runoob -切换到需要删除的数据库
switched to db runoob -输出信息
> db.dropDatabase() -删除数据库,db表示当前数据库,类似 this
{ "dropped" : "runoob", "ok" : 1 } -输出信息
创建集合,删除集合
在 mongodb 中不需要手动创建集合 ,在插入数据时mongodb会自动创建
> db.createCollection("student") -创建集合(不建议)
{ "ok" : 1 } -输出信息
删除集合
> db.student.drop() -删除student 集合
> true -输出信息
查看数据库 and 集合
查看 数据库
> show dbs -也可以写 show databases 效果一样
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
查看集合
> show collections -查看集合也支持 show tables (关系型数据库的)
student
user
insert(添加)
语法:db.<collection>.insert(document)
// db:当前数据库 emp:集合(如果有该集合就先集合中插入一条文档,否则创建该集合) insert:插入语句
db.emp.insert({ -插入一个文档
name : '小黑'
,sex : '男'
,age : '20'
});
db.emp.insert([ -插入多个文档
{
name : '小白'
,sex : '女'
,age : '19'
}
,{
name : '小绿'
,sex : '女'
,age : '21'
}
]);
// mongodb 3.2添加了 insertOne(添加一个文档) 和 insertMany(添加多个文档)方法,使代码更加语义化
db.emp.insertOne({ -插入一个文档
name : '小黑'
,sex : '男'
,age : '20'
});
db.emp.insertMany([ -插入多个文档
{
name : '小白'
,sex : '女'
,age : '19'
}
,{
name : '小绿'
,sex : '女'
,age : '21'
}
]);
PS:添加时每个文档会自动添加一个 "_id" 来确保每个文档的唯一性,当然我们也可以手动添加
例:
{
_id : 'hello'
,name : '小绿'
,sex : '女'
,age : '21'
}
手动添加的话也要确保每个id是唯一的
remove(删除)
语法:
db.collection.remove(
<query>, - 删除条件
{
justOne: <boolean>, - 是否删除只匹配到的第一个文档,默认false
writeConcern: <document> - 抛出异常级别
}
)
例子:
删除全部
db.emp.remove({}); -() 里面不能不写 {} 一般也不会删全部(直接删集合不就好了嘛)
// 按照id删除一个文档
db.emp.remove('5ef9d5aece2f5819e31de72e'); -'5ef9d5aece2f5819e31de72e' 默认按照id删除
// 按照名字删除
db.emp.remove({name : '狗子'});
update(修改)
语法:
db.<collection>.update(
<query>, - 更新条件 类似于sql的while
<update>, - 更新内容
{
[upsert]:false, - 如果数据没有是否插入,默认false
[multi]:false, - 是否更新按条件查询出来的所有数据,默认为false(只更新找到的第一条)
[writeConcern] - 抛出异常的级别
})
例子:
// 按照id更新一条数据
db.emp.update({
_id : ObjectId('5efaa5b887b4fd0ad4001662')
},{
sex : '公'
});
上面这种更新会直接使用 {sec : '公'} 把之前的给替换掉
也就是说我之前的文档是
{
name : '小绿'
,sex : '女'
,age : '21'
}
会直接换成 {sec : '公'} 之前的 name 和 age 都会不见,如果想只更换里面的一个的话需要这样使用
db.emp.update(
{
name : '小xx'
},
{
$set:{
age:'20'
}
}
);
上面的会查找 到 name为 小xx 的文档,把里面的age换成 20
$set 为数据操作符,在最下方有一个表
find(查询)
// db.<collection>.find([条件(json)])
// 查询 emp 集合中所有文档 返回一个数组
db.emp.find({name : '小xx'});
// 查询emp集合中的所有文档
db.emp.find();
// 根据id查询
db.emp.find('5efaa5b887b4fd0ad4001662');
// 根据 性别 and 年龄查询
db.emp.find({sex : '男' , age : '20'});
// PS 存入时与查询时的数据类型要一致 age我之前存入的是string类型,条件直接这样 age : 20 是查询不到的
// 模糊查询 可以使用 正则表达式
db.emp.find({name : /小+[\S]{1}/});
db.emp.find({name : /小\S/});
// 查询集合中有多少条数据 返回 int -
db.emp.find().count();
// 在上面我们说 find 返回的是数组那么就应该有length
db.emp.find().length();
// 如果查询出来的数据绝不查看不方便 那么可以使用pretty()方法格式化数据
db.emp.find().pretty();
数据操作符
名称 | 用法 | 说明 |
---|---|---|
$inc | {$inc:{field:value}} | 对一个数字字段的某个field增加value(说白了就递增多少) |
$set | {$set:{field:value}} | 把文档中某个字段field的值设为value |
$unset | {$unset:{field:1}} | 删除某个字段field |
$push | {$push:{field:value}} | 把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型 |
$pushAll | {$pushAll:{field:value_array}} | 用法同 p u s h 一 样 , 只 是 push一样,只是 push一样,只是pushAll可以一次追加多个值到一个数组字段内。 |
$pullAll | {$pullAll:value_array} | 用法同$pull一样,可以一次性删除数组内的多个值。 |
$addToSet | {$addToSet:{field:value}} | 加一个值到数组内,而且只有当这个值在数组中不存在时才增加。 |
$pop | 删除数组内第一个值:{KaTeX parse error: Expected 'EOF', got '}' at position 15: pop:{field:-1}}̲、删除数组内最后一个值:{pop:{field:1}} | 用于删除数组内的一个值 |
$pull | {$pull:{field:_value}} | 从数组field内删除一个等于_value的值 |
$rename | {$rename:{old_field_name:new_field_name}} | 对字段进行重命名 |