MongoDB 是什么?( 二 )


 
2.插入语法db.users.insert({username:"smith"})db.users.save({username:"smith"})

  • 区别:若新增的数据中存在主键,insert 会提示错误,而save 则更改原来的内容为新内容 。如:
    已存在数据:{_id : 1, " name " : " n1 " },再次进行插入操作时,insert({_id : 1, " name " : " n2 " }) 会报主键重复的错误提示,save({ _id : 1, " name " : " n2 " }) 会把 n1 修改为 n2。
  • 相同点:若新增的数据中没有主键时,会增加一条记录 。已存在数据:{ _id : 1, " name " : " n1 " },再次进行插入操作时,insert({ " name " : " n2 " }) 插入的数据因为没有主键,所以会增加一条数据,save({ " name " : " n2 " }) 增加一条数据 。
 
3.查找语法db.users.finddb.users.count 
4.更新语法db.users.update({username:"smith"},{$set:{country:"Canada"}})//把用户名为smith的用户的国家改成Canadadb.users.update({username:"smith"},{$unset:{country:1}})//把用户名为smith的用户的国家字段给移除db.users.update({username:"jones"},{$set:{favorites:{movies:["casablance","rocky"]}}})//这里主要体现多值修改,在favorties字段中添加多个值db.users.update({"favorites.movies":"casablance"},{$addToSet:{favorites.movies:"the maltese"}},false,true)//多项更新 
5.删除语法db.foo.remove //删除所有数据db.foo.remove({favorties.cities:"cheyene"}) //根据条件进行删除db.drop //删除整个集合 
6.索引相关语法db.numbers.ensureIndex({num:1})//创建一个升序索引db.numbers.getIndexes//获取全部索引 
7.基本管理语法show dbs//查询所有数据库show collections//显示所有表db.stats//显示数据库状态信息db.numbers.stats//显示集合表状态信息db,shutdownServer//停止数据库db.help//获取数据库操作命令db.foo.help//获取表操作命令tab 键 //能自动帮我们补全命令以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是JAVA驱动去操作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB 。
 
三、使用java驱动使用java驱动链接MongoDB是一件非常简单的事情,简单的引用,简单的做增删改查 。在使用完java驱动后我才发现spring 对MongoDB 的封装还不如官方自身提供出来的东西好用,下面简单的展示一下使用 。
 
1.使用maven引入jar包 <dependency><groupId>org.mongodbgroupId><artifactId>mongodb-driver-syncartifactId><version>3.8.0-beta3version>dependency> 
2.创建一个访问客户端MongoClient client = MongoClients.create(“mongodb://10.201.76.94:27017”); 
3.获取集合数量public long count {MongoClient client = this.getClient;MongoCollectionreturn collections.count;} 
4.查询集合public ListMongoClient client = this.getClient;MongoCollectionListcollections.find(params).sort(sort).skip(skip).limit(limit).forEach(new Block@Overridepublic void Apply(Document document) {list.add(document);}});return list;}这里只举例了简单的链接与简单的MongoDB操作,可见其操作的容易性 。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果 。
插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误 。
 
四、schema 设计原则1.需要关注MongoDB的自身的特性要清楚了解MongoDB的基本数据单元 。在关系型数据库中有带列和行的数据表 。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作 。
 
2.需要关注系统本身的读写特性如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低 。系统本身的需求决定mysql还是MongoDB 。


推荐阅读