首页 > 数据库 > MongoDB > 正文

十天掌握MongoDB之二:MongoDB的增删改操作

2020-03-14 13:23:29
字体:
来源:转载
供稿:网友

添加文档

db.foo.insert({"test" : "test"})

1、插入 时MongoDB会检查文档是否包含_id,如果文档没有指定_id,MongoDB会为其创建。

2、对于多个文档,我们推荐批量操作,批量操作有如下优点:更少的连接次数、更少的信息头检测、对“待插入集合”的灵活控制;

3、默认情况下,插入文档时MongoDB仅检查传入数据是否包含 _id 以及数据大小是否超过16MB( v1.8 - 为 4M ) ,除此之外不再做任何验证;

4、MongoDB在插入数据时不执行任何代码,因此没有注入攻击的风险;

删除文档

// 删除全部文档(清空集合)

db.foo.remove();

// 删除指定记录

db.foo.remove({"test" : "test"});

建议: 如果要清空集合,而且集合内包含了过多记录时,不妨考虑使用 db.drop_collection(‘foo’) 命令直接删除集合,然后使用 db.foo.ensureIndex() 命令重建索引 (之前的索引已经被 drop 掉了)。

更新文档

// 原 文档

{

"_ id" : ObjectId ( "4b2b9f67a1f631733d917a7a " ),

" name" : "joe " ,

" friends" : 32 ,

" enemies" : 2

}

// 期望 结果

{

"_ id" : ObjectId ( "4b2b9f67a1f631733d917a7a" ),

" username" : "joe" ,

" relationships" :

{

" friends" : 32 ,

" enemies" : 2

}

}

操作:

// 操作:首先查找记录

var joe = db . users . findOne ({ "name" : " joe" });

// 修改记录 属性,很普通的 JavaScript 语法

joe . relationships = { "friends" : joe . friends , "enemies" :

joe . enemies };

joe . username = joe . name ;

delete joe . friends ;

delete joe . enemies ;

delete joe . name ;

// 更新

db . users . update ({ " name" : "joe" }, joe );

update有2个可选的bool参数,第1个表示是否开启upsert模式(文档存在时更新,不存在时自动创建);第2个表示是否开启multi模式(默认情况下update操作只会更新第一个匹配到的文档,如果开启multi模式,则会更新所有匹配到的文档)。

更新文档 - UPSERT 模式

// 更新:指定第三个参数为 true 可以开启 upsert 模式

db . users . update ({ " name" : "joe" }, joe, true );

在upsert模式下,如果找到匹配的记录则更新之,否则如果找不到匹配记录就会创建一条新的记录。

更新文档 - MULTI 模式

// 更新:指定第四个参数为 true 可以开启 multi 模式

db . users . update ({ " name" : "joe" }, joe, true , true );

默认情况下update只会更新第一个匹配到的文档,开启multi模式,才会更新所有匹配到的文档。

需要注意的是:MongoDB的update操作是替换整个文档的,而不是对文档做出局部修改。如果要单独修改一个或多个键或值,请使用修改器。

更新文档 - 修改器

修改器 说明 备注
$inc 增加或减少数字的值,键不存在时会自动创建 数字
$set 设置指定键的值,键不存在时会自动创建  
$unset $set的反操作,会删除键及键值  
$push 将元素追加到数组末尾,数组不存在会自动创建 数组
$pushAll $push的批量操作版本 数组
$addToSet 同$pushAll,但会自动过滤重复元素 数组
$pop {$pop : {key : 1}}——从数组末尾移除元素
{$pop : {key : -1}}——从数组开头移除原色
数组
$pull 从数组中移除所有匹配的元素 数组
$pullAll $pull的批量操作版本 数组
$rename 修改指定键的键名
$bit 对整形键值执行位操作“与”、“或”等 数字

定位操作符 - $

我们在更新文档的时候,可以这样写:{ '$set': { foo.3.hits = 5 } }【对数组中下标是3的进行了修改】。问题是假设我们不知道元素的下标该怎么办?这时候就可以使用$来定位查询文档已经匹配的元素。

// $inc 操作

db . blog . update (

{ " post" : post_id },

{ "$ inc" : { " comments. $ .votes" : 1 } }

);

// $set 操作

db . blog . update (

{ " comments.author" : "John" },

{ "$ set" : { " comments. $ .author" : "Jim" } }

);

/* 注意:定位符只会更新第 1 个匹配到的元素!!! */

MongoDB的增删改操作都是瞬间完成的,无需等待执行结果,而且操作完成后不会再向客户端反馈结果。显而易见,速度快是它的优点,无法保证操作数据的完整性是它的缺点。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表