对于NoSQL并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:
- 不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
- 无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
- 弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
- 分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
- 异步复制:和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
- BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
Mongodb是Nosql的比较方便成熟的一种数据库
代码部分
public class DbNopass {
private String ip = "localhost";
private Integer port = 27017;
private MongoClient mongoClient;
private MongoDatabase mongoDatabase;
private MongoCollection<Document> collection;
/**
* 连接DB
*/
public void connectDb() {
mongoClient = new MongoClient(ip, port);
mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("------连接数据库成功------");
collection = mongoDatabase.getCollection("test");
System.out.println("------集合 test 选择成功------\r\n");
}
/**
* 创建集合
*/
public void createCollection() {
mongoDatabase.createCollection("test");
System.out.println("------集合test创建成功------\r\n");
}
/**
* 插入文档
*/
public void insertDocument() {
/**
* 1. 创建文档 org.bson.Document 参数为key-value的格式 2. 创建文档集合List<Document> 3.
* 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用
* mongoCollection.insertOne(Document)
*/
Document document = new Document("title", "MongoDB").append("description", "database").append("likes", 100)
.append("by", "Fly");
List<Document> documents = new ArrayList<Document>();
documents.add(document);
collection.insertMany(documents);
System.out.println("------文档插入成功------\r\n");
}
public void select(){
/**
* 1. 获取迭代器FindIterable<Document>
* 2. 获取游标MongoCursor<Document>
* 3. 通过游标遍历检索出的文档集合
* */
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
System.out.println("------查询结果------");
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
System.out.println("\r\n");
}
public void update(){
collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
System.out.println("------查看更新之后的数据------");
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
System.out.println("\r\n");
}
public void delete(){
collection.deleteOne(Filters.eq("likes", 200));
collection.deleteMany (Filters.eq("likes", 200));
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
System.out.println("------查看删除之后的数据------");
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
System.out.println("\r\n");
}
public static void main(String args[]) {
DbNopass db = new DbNopass();
db.connectDb();
db.createCollection();
db.insertDocument();
db.select();
db.update();
db.delete();
}
}
打印结果