添加

下面我们来建立一个test 的集合并写入一些数据。建立两个对象j 和t , 并保存到集合中去。在例子里 “>” 来表示是 shell 输入提示符
    > j = { name : "mongo" };
    {"name" : "mongo"}
    > t = { x : 3 };
    { "x" : 3 }
    > db.things.save(j);
    > db.things.save(t);
    > db.things.find();
    { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
    { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
    >
    有几点需要注意一下:
    1、不需要预先创建一个集合. 在第一次插入数据时候会自动创建。
    2、在文档中其实可以存储任何结构的数据, 当然在实际应用我们存储的还是相同类型文档的集合. 这个特性其实可以在应用里很灵活, 你不需要类似alter table 语句来修改你的数据结构。
    3、每次插入数据时候集合中都会有一个ID, 名字叫 _id,待会会详细介绍!
    下面再加点数据(循环添加):
  > for( var i = 1; i < 10; i++ ) db.things.save( { x:4, j:i } ); 
    > db.things.find();
    {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
    {"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}
    {"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
    {"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}
    {"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
    {"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
    {"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}
    {"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}
    {"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
    {"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
    请注意一下, 这里循环次数是10, 但是只显示到第8 条, 还有2 条数据没有显示。 如果想继续查询下面的数据只需要使用”it”命令, 就会继续显示下面的数据:
    { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 }
    { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }
    has more
    > it
    { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }
    { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
    从技术上讲 find() 返回一个游标对象. 但在上面的例子里, 并没有拿到一个游标的变量。所以 shell 自动遍历游标, 返回一个初始化的set, 并允许我们继续用 it 迭代输出。当然我们也可以直接用游标来输出, 不过这个是”游标”部分的内容了。
    _id key
    MongoDB 支持的数据类型中,_id 是其自有产物,下面对其做些简单的介绍。存储在MongoDB 集合中的每个文档(document)都有一个默认的主键_id,这个主键名称是固定的,它可以是MongoDB 支持的任何数据类型,默认是ObjectId。在关系数据库schema设计中,主键大多是数值型的,比如常用的int 和long,并且更通常的是主键的取值由数据库自增获得,这种主键数值的有序性有时也表明了某种逻辑。反观MongoDB,它在设计之初就定位于分布式存储系统,所以它原生的不支持自增主键。
    _id key 举例说明 :
    当我们在往一个集合中写入一条文档时,系统会自动生成一个名为_id 的key.如:
    > db.c1.find()
    { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
    { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }
    这里多出了一个类型为ObjectId 的key ,在插入时并没有指定,这有点类似Oracle 的rowid的信息,属于自动生成的。在MongoDB 中,每一个集合都必须有一个叫做_id 的字段,字段类型默认是ObjectId ,换句话说,字段类型可以不是ObjectId,例如:
    > db.c1.find()
    { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
    { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }
    { "_id" : 3, "name" : "Bill", "age" : 55 }
    虽然_id 的类型可以自由指定,但是在同一个集合中必须唯一,如果插入重复的值的话,系统将会抛出异常,具体如下:  
    > db.c1.insert({_id:3, name:"Bill_new", age:55})
    E11000 duplicate key error index: test.c1.$_id_ dup key: { : 3.0 }

>

查询
    普通查询
    在没有深入查询之前, 我们先看看怎么从一个查询中返回一个游标对象. 可以简单的通过find() 来查询, 他返回一个任意结构的集合. 如果实现特定的查询稍后讲解.
实现上面同样的查询, 然后通过 while 来输出:
    > var cursor = db.things.find();
    > while (cursor.hasNext()) printjson(cursor.next());
    { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
    { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
    { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
    { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 }
    { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
    { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
    { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 }
    上面的例子显示了游标风格的迭代输出. hasNext() 函数告诉我们是否还有数据, 如果有则可以调用 next() 函数。
    当我们使用的是 JavaScript shell, 可以用到JS 的特性, forEach 就可以输出游标了. 下面的例子就是使用 forEach() 来循环输出: forEach() 必须定义一个函数供每个游标元素调用。
    > db.things.find().forEach(printjson);
    { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
    { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
    { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
    { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 }
    { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
    { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
    { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 }
    在 MongoDB shell 里, 我们也可以把游标当作数组来用:
    > var cursor = db.things.find();
    > printjson(cursor[4]);
    { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
    使用游标时候请注意占用内存的问题, 特别是很大的游标对象, 有可能会内存溢出. 所以应该用迭代的方式来输出. 下面的示例则是把游标转换成真实的数组类型:
    > var arr = db.things.find().toArray();
    > arr[5];
    { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
    请注意这些特性只是在MongoDB shell 里使用, 而不是所有的其他应用程序驱动都支持。MongoDB 游标对象不是没有快照,如果有其他用户在集合里第一次或者最后一次调用next(), 你可能得不到游标里的数据. 所以要明确的锁定你要查询的游标。

条件查询
    到这里我们已经知道怎么从游标里实现一个查询并返回数据对象, 下面就来看看怎么根据指定的条件来查询。
    下面的示例就是说明如何执行一个类似SQL 的查询, 并演示了怎么在 MongoDB 里实现。这是在MongoDB shell 里查询, 当然你也可以用其他的应用程序驱动或者语言来实现:
    SELECT * FROM things WHERE name="mongo"
    > db.things.find({name:"mongo"}).forEach(printjson);
    { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
    SELECT * FROM things WHERE x=4
    > db.things.find({x:4}).forEach(printjson);
    { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
    { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 }
    { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
    { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
    { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 }
    查询条件是 { a:A, b:B, … } 类似 “where a==A and b==B and …”。
    上面显示的是所有的元素, 当然我们也可以返回特定的元素, 类似于返回表里某字段的值,只需要在 find({x:4}) 里指定元素的名字。
    SELECT j FROM things WHERE x=4
   > db.things.find({x:4}, {j:true}).forEach(printjson);
    { "_id" : ObjectId("4c220a42f3924d31102bd856"), "j" : 1 }
   { "_id" : ObjectId("4c220a42f3924d31102bd857"), "j" : 2 }
   { "_id" : ObjectId("4c220a42f3924d31102bd858"), "j" : 3 }
   { "_id" : ObjectId("4c220a42f3924d31102bd859"), "j" : 4 }
   { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "j" : 5 }
    为了方便考虑, MongoDB shell 避免游标可能带来的开销, 提供一个findOne() 函数. 这个函数和 find() 函数一样, 不过它返回的是游标里第一条数据, 或者返回null,即空数据。作为一个例子, name=”mongo” 可以用很多方法来实现, 可以用 next() 来循环游标或者当做数组返回第一个元素,但是用 findOne() 方法则更简单和高效:  
   > printjson(db.things.findOne({name:"mongo"}));
   { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
    如果需要限制结果集的长度, 那么可以调用 limit 方法。这是强烈推荐解决性能问题的方法, 就是通过限制条数来减少网络传输, 例如:

> db.things.find().limit(3);

{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }

{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }

{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }

修改

    将name 是mongo 的记录的name 修改为mongo_new
    > db.things.update({name:"mongo"},{$set:{name:"mongo_new"}});
     我们来查询一下是否改过来了  

> db.things.find();

{ "_id" : ObjectId("4faa9e7dedd27e6d86d86371"), "x" : 3 }

{ "_id" : ObjectId("4faa9e7bedd27e6d86d86370"), "name" : "mongo_new" }

删除
    将用户name 是mongo_new 的记录从集合things 中删除、
    > db.things.remove({name:"mongo_new"});
    > db.things.find();
    { "_id" : ObjectId("4faa9e7dedd27e6d86d86371"), "x" : 3 }
    经验证,该记录确实被删除了。
    至此,增删改差案例都差不多完整了,或者如果有不完整的地方,欢迎大家留言!

MongoDB整理笔记のCRUD的更多相关文章

  1. MongoDB整理笔记のMapReduce

    MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...

  2. MongoDB整理笔记のjava MongoDB分页优化

    最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...

  3. MongoDB整理笔记のID自增长

    以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_i ...

  4. MongoDB整理笔记のReplica Sets + Sharding

    MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...

  5. MongoDB整理笔记の新增Shard Server

    1.启动一个新Shard Server 进程 [root@localhost ~]# mkdir /data/shard/s2 [root@localhost ~]# /Apps/mongo/bin/ ...

  6. MongoDB整理笔记のSharding分片

    这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...

  7. MongoDB整理笔记の增加节点

    MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...

  8. MongoDB整理笔记の管理Replica Sets

    一.读写分离 从库能进行查询,这样可以分担主库的大量的查询请求.   1.先向主库中插入一条测试数据 [root@localhost bin]# ./mongo --port 28010 MongoD ...

  9. MongoDB整理笔记のReplica oplog

    主从操作日志oplog MongoDB的Replica Set架构是通过一个日志来存储写操作的,这个日志就叫做"oplog".oplog.rs是一个固定长度的capped coll ...

随机推荐

  1. vim中多行注释和多行删除命令

      1.多行注释:   1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;   2. 在行首使用上下键选择需要注释的多行;   3. 按下键盘(大写)“I”键,进入插入 ...

  2. 2、Flume1.7.0入门:安装、部署、及flume的案例

    一.什么是Flume? flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用. flume的特点: flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的 ...

  3. Tair 分布式K-V存储方案

    tair 是淘宝的一个开源项目,它是一个分布式的key/value结构数据的解决方案. 作为一个分布式系统,Tair由一个中心控制节点(config server)和一系列的服务节点(data ser ...

  4. module_param 用于动态开启/关闭 驱动打印信息

    1.定义模块参数的方法: module_param(name, type, perm); 其中,name:表示参数的名字;      type:表示参数的类型;      perm:表示参数的访问权限 ...

  5. (转)winform下UPD通信的简单应用

    本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557046 先看效果图: 使用UDP的好处就是不需要三次握手,但是缺点就是存 ...

  6. java代码反转toCharAT()的用法

    总结:反转注意for循环里面的变化 package clientFrame; //字符串反转 public class we { public static void main(String[] ar ...

  7. xunsearch进阶使用

    目录 设置分页 设置排序 读取文档结果 搜索结果高亮处理 获取数量 获取热门搜索词 获取相关搜索词 设置分页 $search->setLimit(5); // 设置返回结果为前 5 条 $sea ...

  8. 《转载》ubuntu Sublime text 3 解决中文输入问题

    其实,在这个文章之前,网上都有好多教程了.不知道是不是因为复制黏贴的传播太多,导致有些字符串的丢失,导致编译失败,so库文件无法载入,从而不能输入中文.折腾了许久之后,终于搞定了.记录下来,方便自己下 ...

  9. 决策树 ID3 C4.5 CART(未完)

    1.决策树 :监督学习 决策树是一种依托决策而建立起来的一种树. 在机器学习中,决策树是一种预测模型,代表的是一种对象属性与对象值之间的一种映射关系,每一个节点代表某个对象,树中的每一个分叉路径代表某 ...

  10. centos7 xfs 文件系统配置quota 用户磁盘配额

    centos7的xfs配置   XFS是扩展性高.高性能的文件系统.也是rhel7/centos7的默认文件系统.XFS支持metadata journaling,这使其能从crash中更快速的恢复. ...