添加文档
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的增删改操作都是瞬间完成的,无需等待执行结果,而且操作完成后不会再向客户端反馈结果。显而易见,速度快是它的优点,无法保证操作数据的完整性是它的缺点。
新闻热点
疑难解答