创建文档

向MongoDB插入数据,使用insert,

如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})

这个操作会给 文档 增加 一个"_id",键,并保存在数据库中。

批量插入

如果要插入多个文档,使用批量插入会快一些,批量化插入能传入一个有文档构成的数据给数据库

一次批量插入只是单个的TCP请求,避免了许多零碎的请求带来的开销.由于无需处理大量的消息头,

这样能减少插入时间.每当单个文档发送致数据库时,会有一个头部信息,告诉数据库对指定的集合做

插入操作.用批量插入的话,数据库就不用重复的处理每个文档的这种头部信息了.

当前版本MongoDB消息的最大长度是16M,使用批量插入是有这个限制的.

插入的原理和作用

当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库.数据库解析

BSON,检验是否包含"_id"键并且不超过16M,除此之外,不做别的验证,就只是简单的将文档原样的

存入数据库.这样做的坏处是允许插入无效的数据,好处是能让数据库更加安全,远离注入式攻击.

所有的主流语言的驱动会在传送数据之前进行一些数据的有效性检查(文档是否超长,是否含非utf-8的字符,

是否使用了未知类型).同样也可以启动数据库服务器的时候使用--objcheck选项,这样服务器就会在插入

之前先检验文档结构的有效性,当然这样要牺牲性能.

查看doc文档转化为BSON的大小(以字节为单位),在shell中使用Object.bsonsize(doc)

删除文档

db.users.remove()

会删除users集合的所有文档,但不会删除集合本身,原有的索引也会保留.

remove函数可以接受一个查询文档作为可选参数,给定这个参数,只有符合条件的文档才会被删除.

db.users.remove({"name":"Refactor"})

删除数据的永久性的,不能撤销和恢复.

如果要清除整个集合,直接删除集合(然后重建索引)比删除集合中所有的文档要快.

删除集合:db.drop_collection("users")

更新文档

update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档进行那些更改

更新的操作是原子性的,若两个更新同时发生,先到服务器的先执行,然后执行另一个.最后的更新会显示在数据库

文档替换

更新最简单的就是使用一个新文档来替代匹配的文档,这适用于模式结构发生较大变化的时候.如将下面的文档

{
  "name":"refactor",
  "friends":20,
  enemies:2
}

更改为

{
  "name":"refactor",
  "relationships":
  {
    "friends":20,
    enemies:2
  }
}

使用修改器

通常文档只会有一部分更新,利用原子的"更新修改器",更新修改器是特殊的键,用来指定复杂的更新操作,比如:

调整,增加,删除键,操作数组,操作内嵌文档.

一般网站都有计数器,来记数公有多少人访问,可以使用原子修改器原子性的完成整个功能.如:

"$set"修改器入门

"$set"用来指定一个键的值,如果键不存在,则创建,这对更新模式或者增加用户定义键来说很方便.

如:
db.users.insert(
  {
    "name":"refactor",
    "age":23,
    "sex":"male"
  }
)
添加喜欢的书籍:
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace"}
  }
)
db.users.findOne(
  {"name":"refactor"}
 )
修改喜欢的数据
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace2"}
  }
)
"$set"可以修改键的数据类型,如果喜欢多本书,
将book键的值变为一个数组
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":["war and peace","war and peace2"]}
  }
)
使用"$unset"将键删除,没有要删除的键也不报错
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$unset":{"book":1}
  }
)
使用"$set"修改内嵌文档
db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

db.blog.update(
  {
    "author.name":"refactor"
  },
  {
    "$set":{"author.name":"refactor2"}
  }
)
db.blog.findOne(
  {
    "title":"refactor's blog"
  }
)
增加,修改,删除键的时候,应该使用$修改器.一定要使用$开头的修改器来修改键值对.

使用"$inc" 增加和减少

"$inc"用来增加已有键的值,若不存在键,则增加.用于分析数据,因果关系,投票或其他有变化值的地方.

如:

db.users.insert(
  {"url":"http://www.cnblogs.com/refactor"}
)

使用"$inc" 增加一个键pageViews,默认值为10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"给键pageViews,再增加10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"给键pageViews,再减少10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":-10000}}
)

"$inc"和"$set"用法相似,用来增加或减少数字."$inc"只能用于整数,长整数或双精度浮点数.

虽然很多语言能将 null,bool,有数字构成的字符串 转化成 数字,但使用"$inc"仍会报错:

"$inc"键的值也必须为数字.

数组修改器

"$push"和"$pop"只能用于数组.

如果指定的键已存在,"$push"会向已有的数组末尾加入一个元素,如果键不存在,就创建一个新数组.

如:

db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

向以上文档中,添加一个包含一个数组的"comment"键,还向 comment 数组push一个评论.

这个数组会自动创建,并加入评论:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor2",
        "content":"nice"
      }
    }
  }
)

还想添加一条评论:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor3",
        "content":"good"
      }
    }
  }
)

如果一个值不在数组里就把它加进去.可以在查询文档时使用"$ne".

使用"$addToSet"

db.users.insert(
  {
    "userName":"refactor",
    "emails":
    [
      "295240648@163.com",
      "295240648@126.com"
    ]
  }
)

向emails添加新地址,用"$addToSet"避免重复

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@163.com"
    }
  }
)

这样"295240648@163.com" 不会插入到emails中

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@qq.com"
    }
  }
)

这样"295240648@qq.com" 会插入到emails中

将"$addToSet"和"$each"一起使用,可以添加不同的值.

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":
      {
        "$each":
        [
          "295240648@111.com",
          "295240648@112.com",
          "295240648@113.com"
        ]
      }
    }
  }
)

使用"$pop",可以从数组任何一端删除元素.

{$pop:{key:1}}从数组末尾删除一个元素
{$pop:{key:-1}}从数组头部删除一个元素

使用"$pull",可以根据特定条件删除元素,也可以根据位置删除元素

db.users.update(
  {"userName":"refactor"},
  {
    "$pull":
    {
      "emails":"295240648@111.com"
    }
  }
)

"$pull"会将所有匹配的部分删掉,对于数组[1,1,2,1]执行pull 1,得到的结果数组是[2]

mongodb 创建更新语法的更多相关文章

  1. MongoDB创建\更新\删除文档操作

     一.插入\创建文档 --当插入一个不存在的文档时,会自己主动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecti ...

  2. 《mongoDB》基本操作-创建/更新/删除文档

    一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo -  use db_name; 选择你要操作的集合 > use demo switched to db dem ...

  3. MongoDb 创建、更新以及删除文档常用命令

    mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...

  4. mongodb常用查询语法

    一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...

  5. Mongodb的基本语法

    前段时间工作上面由于没有多少事所以玩了玩mongodb,学习了它的基本语法,然后现在在这里做一个简单的总结. 1.我是在win平台上面,启动的话比较麻烦,所以我就简单的把启动过程做了个批处理文件 启动 ...

  6. Mongodb与mysql语法比较

    Mongodb与mysql语法比较   mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由 ...

  7. MongoDB 常用查询语法

    一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...

  8. Mongodb创建数据库

    基本语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 coderschool ...

  9. MongoDB 创建数据库

    语法 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 实例 以下实例我们创建了数据库 runoob: > ...

随机推荐

  1. Web API中的路由(一)——约定路由

    一.Web API中的路由概念 路由的作用用一句话说明:通过request的uri找到处理该请求的Controller,Action,以及给Action的参数赋值. 一些路由的基本概念: route: ...

  2. eclipse将javaSE项目导出成可执行jar包

    将第三方包和项目打包到一块 step1:选中要导出的项目,右键选择Export step2:选择java/Runable JAR file step3:选择main主程序,选择第三方包打包的形式,推荐 ...

  3. Shell编程(二)Bash中调用Python

  4. Windows 查看某个端口号是否被占用

    Ø  前言 在 Windows 下很多系统或服务都需要使用独立的端口号,实现网络数据传输,如果需要知道某个端口号是否被占用,就可以使用下面步骤了. 1.   首先打开命令窗口,Windows + R ...

  5. getnameinfo函数

    一.函数原型 #include <netdb.h> int getnamefo(const struct sockaddr *sockaddr, socklen_t addrlen, ch ...

  6. 【python小练】0017-将xls文件内容写入xml文件中

    第 0017 题: 将 第 0014 题中的 student.xls 文件中的内容写到 student.xml 文件中,如 下所示: <?xml version="1.0" ...

  7. Java SE之网络编程:知识框架

  8. Chrome及Firefox插件

    注:以下所有工具都是笔者自己目前使用的 密码管理工具 lastpass 护眼工具 眼睛护航 待续……

  9. 第27月第25天 clang -rewrite-objc main.m

    1.clang -rewrite-objc main.m #import <objc/runtime.h> #import<objc/message.h> #import &l ...

  10. 前端分辨pc和移动端导入不同css

    通过navigator获取浏览器,根据浏览器的不同判断出pc和移动端然后设置不同的css 分辨不同屏幕导入不同的css文件: function loadCSS() { if((navigator.us ...