MongoDB命令之集合数据操作(CURD)
在MongoDB命令之基本操作 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中可以看到如果新建了数据库,但是数据库中没有数据,使用show dbs是看不到新建的数据库的,必须insert一条数据。这个操作就是MongoDB数据操作的增添数据,那还有其他操作(增删查改)下面详细介绍。
一、数据添加:insert
1、插⼊单条数据:db.集合名.insert(⽂档)
⽂档的数据结构和JSON基本⼀样,所有存储在集合中的数据都是BSON格式。
MongoDB中原没有名为test的数据库。插入数据时,MongoDB自动创建名为test的数据库同时建名为lf_resume_preview的集合。根据MongoDB返回的操作结果看,insert一份文档成功。
2、插⼊多条数据:db.集合名.insert([⽂档,⽂档])
测试上例中的数据,并增加一份文档
通过验证可以看到相同的数据也insert成功。相同数据在集合中的不同点在于_id——系统自动生成了一个,其规则为:
1)前4个字节表示时间戳 ObjectId("对象Id字符串").getTimestamp() 来获取
2)接下来的3个字节是机器标识码
3)紧接的两个字节由进程id组成(PID)
4)最后三个字节是随机数
当然如果不需要系统生成也可以自定义(可以参考MongoDB 自动增长 | 菜鸟教程 (runoob.com))。
也可以先生成文档,在Insert文档,如下:
二、数据查询:find
上面案例中已经使用了数据查询db.collectionname.find()——这是一个没有任何条件的查询。实际上find方法支持条件查询,具体如下:
1、比较条件查询:db.collectionname.find(Conditions)
2、逻辑条件查询
1)and 条件
MongoDB 的 find() ⽅法可以传⼊多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件db.集合名.find({key1:value1, key2:value2}).pretty()
2)or 条件
db.集合名.find({$or:[{key1:value1}, {key2:value2}]}).pretty()
3)not 条件
db.集合名.find({key:{$not:{$操作符:value}}).pretty()
3、分页查询
db.集合名.find({条件}).sort({排序字段:排序⽅式})).skip(跳过的⾏数).limit(⼀⻚显示多少数据)
三、数据更新:update
$set :设置字段值
$unset :删除指定字段
$inc:对修改的值进⾏⾃增
db.集合名.update(
<query>, //query : update的查询条件,类似sql update查询内where后⾯的
<update>, //update : update的对象和⼀些更新的操作符(如$set,$inc...)等,也可以理解为sql update中set后⾯的
{
upsert: <boolean>, //upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插⼊objNew,true为插⼊,默认是false,不插⼊。
multi: <boolean>, //multi : 可选, MongoDB 默认是false,只更新找到的第⼀条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern: <document> //writeConcern :可选,⽤来指定mongod对写操作的回执⾏为⽐如写的⾏为是否需要确认。
}
)
举例:db.集合名.update({条件},{$set:{字段名:值}},{multi:true})
writeConcern 包括字段:{ w: <value>, j: <boolean>, wtimeout: <number> }
w:指定写操作传播到的成员数量。⽐如:
w=1(默认) :则要求得到写操作已经传播到独⽴的Mongod实例或副本集的primary成员的确认
w=0:则不要求确认写操作,可能会返回socket exceptions和 networking errors
w="majority":要求得到写操作已经传播到⼤多数具有存储数据具有投票的(data-bearing voting )成员(也就是 members[n].votes 值⼤于0的成员)的确认
j:要求得到Mongodb的写操作已经写到硬盘⽇志的确认。⽐如:
j=true:要求得到Mongodb(w指定的实例个数)的写操作已经写到硬盘⽇志的确认。 j=true本身并不保证因为副本集故障⽽不会回滚。
wtimeout:指定write concern的时间限制,只适⽤于w>1的情况。wtimeout在超过指定时间后写操作会返回error,即使写操作最后执⾏成功,当这些写操作返回时, MongoDB不会撤消在wtimeout时间限制之前执⾏成功的数据修改。如果未指定wtimeout选项且未指定write concern级别,则写⼊操作将⽆限期阻⽌。 指定wtimeout值为0等同于没有wtimeout选项
将一张表中某个字段的值赋值给另一个字段,可以综合find与update方法,如下:
修改前数据:
进行修改:
修改后数据:
四、数据删除:remove
db.collection.remove(
<query>, //query :(可选)删除的⽂档的条件。
{
justOne: <boolean>, //justOne : (可选)如果设为 true 或 1,则只删除⼀个⽂档,如果不设置该参数,或使⽤默认值 false,则删除所有匹配条件的⽂档。
writeConcern: <document> //writeConcern :(可选)⽤来指定mongod对写操作的回执⾏为
}
)