创建文档

向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. 设计模式---数据结构模式之职责链模式(Chain of Responsibility)

    一:概念 职责链模式(CoR,Chain of Responsibility)是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被 ...

  2. Git(创建与合并分支)

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  3. 阿里面试题:为什么Map桶中个数超过8才转为红黑树

    (为什么一个是8一个是6:防止频繁来回转换小消耗性能) 这是笔者面试阿里时,被问及的一个问题,应该不少人看到这个问题都会一面懵逼.因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什 ...

  4. 【leetcode-66】 加一

    给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...

  5. HDU 6373(斜面上小球弹跳 运动分解)

    题意是给定两个点的位置,过原点引一条射线穿过第一个点,射线位置作为斜面位置,第二个点处令一小球自由落体,问小球能碰撞到斜面几次. 开始时想算出两次碰撞中小球沿斜面运动的距离,然后发现每一段距离会因为高 ...

  6. LeetCode(194.Transpose File)(awk进阶)

    194. Transpose File Given a text file file.txt, transpose its content. You may assume that each row ...

  7. IScroll基本用法

    一.为了防止手机上卡顿:1.从新设置一下焦点.2. <script>try { window.PointerEvent = undefined; } catch (e) { } </ ...

  8. HDB3 译码器

    一.HDB3译码方案一: 插入V/B的情况是有两种,两个或三个零两端同极性,也就是要把代码二进制表示的“+1 0 0 0 +1”或“-1 0 0 0 -1”变成“1 0 0 0”,把“+1 0 0 + ...

  9. ue4 Skeletal Mesh编辑器

    skeletal mesh:骨骼网络物体资源 由 美术制作(*.fbx). 在ue4可对此资源进行编辑以添加一些游戏需要的设置. https://docs.unrealengine.com/lates ...

  10. mysql 案例 ~ mysql主从复制错误问题

    简介 mysql主从不同步的几种情况 一  具体情况   1 主库有memory引擎的内存表      分析 由于memory表的数据存放在内存中,一旦主库数据丢失,从库可能就会发生数据复制异常    ...