本文总结来自MongoDB 的java版本的Driver(驱动) api入门指南
官网地址:https://docs.mongodb.org/getting-started/java/client/
MongoDB 一个开源的文档型数据库 ,提供高性能,高可用,自动切片的特性。
准备工作
首先我们需要下载一个MongoDB,我嫌麻烦就下载了一个社区版本,编译好的解压就能用。
curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.2.4.tgz
解压启动
tar -zxvf mongodb-osx-x86_64-3.2.4.tgz
直接启动./mongod 的话会出现下面的错误,错误中包含下面提示信息
Data directory /data/db not found
这是因为MongoDB 默认会将数据文件放在/data/db下,我们可以指向其他存在的目录,比如说我们在安装目录下保存数据文件
mkdir -p /work/mongodb-osx-x86_64-3.2.4/dbpath
所以接下来我们可以这样启动
./mongod --dbpath /work/mongodb-osx-x86_64-3.2.4/dbpath
代码很简单,直接上代码,重要的地方说明下即可
一、连接
public static void main(String[] args) {
String dbName = "myDb";
String collectionName = "myTable";
try {
testMongo(dbName, collectionName);
} catch (ParseException e) {
e.printStackTrace();
}
}
public static void testMongo(String dbName, String collectionName) throws ParseException {
MongoClient mc = new MongoClient("192.168.2.6", 27017);
//获取数据库,不用担心之前没有,没有的话会创建一个
MongoDatabase database = mc.getDatabase(dbName);
testCollection(database, collectionName);
mc.close();
}
public static void testCollection(MongoDatabase database, String collectionName) throws ParseException {
//获取数据集合,可以理解为一个表,不用担心之前没有,没有的话会创建一个
MongoCollection<Document> collection = database.getCollection(collectionName);
insert(collection);
find(collection);
update(collection);
remove(collection);
}
二、插入数据
public static void insert(MongoCollection<Document> collection) throws ParseException {
collection.drop();// 每次插入前把之前的数据全部删除
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
collection.insertOne(new Document("address", new Document().append("street", "1 Avenue").append("zipcode", "10075").append("building", "1481")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Manhattan")
.append("cuisine", "Italian")
.append("grades",
asList(new Document().append("date", format.parse("2014-10-01T00:00:00Z")).append("grade", "A").append("score", 12), new Document()
.append("date", format.parse("2014-01-16T00:00:00Z")).append("grade", "B").append("score", 13))).append("name", "Vella")
.append("restaurant_id", "41704621"));
collection.insertOne(new Document("address", new Document().append("street", "2 Avenue").append("zipcode", "10076").append("building", "1482")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Manhattan")
.append("cuisine", "Italian")
.append("grades",
asList(new Document().append("date", format.parse("2014-10-01T00:00:00Z")).append("grade", "A").append("score", 14), new Document()
.append("date", format.parse("2014-01-16T00:00:00Z")).append("grade", "C").append("score", 15))).append("name", "Bruce")
.append("restaurant_id", "41704622"));
collection.insertOne(new Document("address", new Document().append("street", "3 Avenue").append("zipcode", "10077").append("building", "1483")
.append("coord", asList(-73.9557413, 40.7720266)))
.append("borough", "Manhattan")
.append("cuisine", "Italian")
.append("grades",
asList(new Document().append("date", format.parse("2014-10-01T00:00:00Z")).append("grade", "B").append("score", 16), new Document()
.append("date", format.parse("2014-01-16T00:00:00Z")).append("grade", "C").append("score", 17))).append("name", "Aline")
.append("restaurant_id", "41704623"));
}
三、查找
public static void find(MongoCollection<Document> collection) {
/* 查询所有 */
System.out.println("\n 查询所有");
FindIterable<Document> find = collection.find();
find.forEach(getShower());
/* 顶层的查询 ,将整个数据看成一个格式化好的json来理解 */
System.out.println("\n 顶层的查询 ,将整个数据看成一个格式化好的json来理解");
FindIterable<Document> iterable = collection.find(new Document("borough", "Manhattan"));
iterable.forEach(getShower());
System.out.println("\n 利用mongo自带的filter来完成查询,和上一个查询等价");
FindIterable<Document> find2 = collection.find(Filters.eq("borough", "Manhattan"));
find2.forEach(getShower());
/* 非顶层店查询 */
System.out.println("\n 非顶层的查询 ,将整个数据看成一个格式化好的json来理解");
FindIterable<Document> find3 = collection.find(new Document("address.zipcode", "10075"));
find3.forEach(getShower());
System.out.println("\n 利用mongo自带的filter来完成查询,和上一个查询等价");
FindIterable<Document> find4 = collection.find(Filters.eq("address.zipcode", "10075"));
find4.forEach(getShower());
System.out.println("\n 非顶层的在某个数组中查询 ,将整个数据看成一个格式化好的json来理解");
FindIterable<Document> find5 = collection.find(new Document("grades.grade", "B"));
find5.forEach(getShower());
System.out.println("\n 利用mongo自带的filter来完成查询,和上一个查询等价");
FindIterable<Document> find6 = collection.find(Filters.eq("grades.grade", "B"));
find6.forEach(getShower());
/* 自定义查询 */
System.out.println("\n 自定义的查询 利用$gt(great than)");
FindIterable<Document> find7 = collection.find(new Document("grades.score", new Document("$gt", 30)));
find7.forEach(getShower());
System.out.println("\n 利用mongo自带的filter.gt 来完成查询,和上一个查询等价");
FindIterable<Document> find8 = collection.find(Filters.gt("grades.score", 30));
find8.forEach(getShower());
System.out.println("\n 自定义的查询 利用$lt(less than)");
FindIterable<Document> find9 = collection.find(new Document("grades.score", new Document("$lt", 15)));
find9.forEach(getShower());
System.out.println("\n 利用mongo自带的filter.lt 来完成查询,和上一个查询等价");
FindIterable<Document> find10 = collection.find(Filters.lt("grades.score", 15));
find10.forEach(getShower());
/* 组合查询 */
System.out.println("\n 组合查询 and");
FindIterable<Document> find11 = collection.find(new Document("cuisine", "Italian").append("address.zipcode", "10075"));
find11.forEach(getShower());
System.out.println("\n 利用mongo自带的filter.and 来完成组合查询,和上一个查询等价");
FindIterable<Document> find12 = collection.find(Filters.and(Filters.eq("cuisine", "Italian"), Filters.eq("address.zipcode", "10075")));
find12.forEach(getShower());
System.out.println("\n 组合查询 or");
FindIterable<Document> find13 = collection.find(new Document("$or",
asList(new Document("cuisine", "Italian"), new Document("address.zipcode", "10075"))));
find13.forEach(getShower());
System.out.println("\n 利用mongo自带的filter.or 来完成组合查询,和上一个查询等价");
FindIterable<Document> find14 = collection.find(Filters.or(Filters.eq("cuisine", "Italian"), Filters.eq("address.zipcode", "10075")));
find14.forEach(getShower());
/* 查询后的排序 */
System.out.println("\n 通过在查询的结果集后调用sort来完成排序");
FindIterable<Document> find15 = collection.find().sort(new Document("borough", 1).append("address.zipcode", 1));
find15.forEach(getShower());
System.out.println("\n 利用mongo自带的filter.sort 来完成排序,和上一个查询等价");
FindIterable<Document> find16 = collection.find().sort(Sorts.ascending("borough", "address.zipcode"));
find16.forEach(getShower());
}
上面代码中的一些小的工具方法
public static void showall(MongoCollection<Document> collection) {
System.out.println("\n 查询所有");
FindIterable<Document> find = collection.find();
find.forEach(getShower());
}
public static Block<Document> getShower() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Block<Document>() {
public void apply(final Document document) {
System.out.println(document);
}
};
}
四、更新
public static void update(MongoCollection<Document> collection) {
/* 更新顶层节点 ,使用了内置函数 $set , $currentDate */
System.out.println("\n更新顶层节点 ,使用了内置函数 $set , $currentDate 更新之前");
showall(collection);
collection.updateOne(new Document("name", "Aline"),
new Document("$set", new Document("cuisine", "American (New)")).append("$currentDate", new Document("lastModified", true)));
System.out.println("更新之后\n");
showall(collection);
/* 更新非顶层节点,使用了内置函数 $set */
System.out.println("\n更新非顶层节点,使用了内置函数 $set 更新之前");
showall(collection);
collection.updateOne(new Document("restaurant_id", "41704622"), new Document("$set", new Document("address.street", "East 31st Street")));
System.out.println("更新之后\n");
showall(collection);
/* 更新多个 ,使用的是append 函数 */
System.out.println("\n更新多个 ,使用的是append ,$set ,$lastModified 函数 更新之前");
showall(collection);
collection.updateMany(new Document("address.zipcode", "10075").append("cuisine", "Italian"), new Document("$set", new Document("cuisine",
"Category To Be Determined")).append("$currentDate", new Document("lastModified", true)));
System.out.println("更新之后\n");
showall(collection);
/* 替换 */
System.out.println("\n替换 ,可以理解为通过前面的条件查询到_id,对应的记录然后整个替换这条记录");
showall(collection);
collection.replaceOne(
new Document("restaurant_id", "41704622"),
new Document("address", new Document().append("street", "2 Avenue").append("zipcode", "10075").append("building", "1480")
.append("coord", asList(-73.9557413, 40.7720266))).append("name", "Vella 2"));
System.out.println("更新之后\n");
showall(collection);
}
五、删除
public static void remove(MongoCollection<Document> collection) {
/* 删除 */
System.out.println("\n删除符合条件的数据,删除之前的数据如下");
showall(collection);
collection.deleteMany(new Document("borough", "Manhattan"));
System.out.println("删除之后的数据如下");
showall(collection);
System.out.println("\n删除所有数据,删除之前的数据如下");
showall(collection);
collection.deleteMany(new Document());
System.out.println("删除之后的数据如下");
showall(collection);
System.out.println("\n删除整个集合,包括集合中的数据和索引");
showall(collection);
collection.drop();
System.out.println("删除之后的数据如下");
showall(collection);
}
六、补上加索引
public static void index(MongoCollection<Document> collection) {
System.out.println("\n创建单个索引");
collection.createIndex(new Document("cuisine", 1));
System.out.println("\n创建索引");
collection.createIndex(new Document("cuisine", 1).append("address.zipcode", -1));
}