MongoDB中的一条记录就是一个文档(document),里面存储了由字段和值对构成的数据结构。文档看起来很像JSON对象,字段的值可以是数组、其他文档,也可以是文档数组:
{ "_id" : ObjectId("54c955492b7c8eb21818bd09"), "address" : { "street" : "2 Avenue", "zipcode" : "10075", "building" : "1480", "coord" : [ -73.9557413, 40.7720266 ], }, "borough" : "Manhattan", "cuisine" : "Italian", "grades" : [ { "date" : ISODate("2014-10-01T00:00:00Z"), "grade" : "A", "score" : 11 }, { "date" : ISODate("2014-01-16T00:00:00Z"), "grade" : "B", "score" : 17 } ], "name" : "Vella", "restaurant_id" : "41704620" }
MongoDB将文档存储在集合(collection)中,集合也就是关系型数据库的表。不过和表不一样的是,集合完全不要求内部文档必须模式一致。文档也有主键,而且名称必须是_id。你不提供它就会自动添加。
由于MongoDB的文档格式类似于JSON,所以可以从JSON文件导入数据,只要数据格式合法。比如我们把 https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/dataset.json 的内容保存起来,命名为dbset.json。我们通过下面这条命令导入这些数据到集合restaaurants中:
mongoimport --db test --collection restaurants --drop --file dbset.json
工具是mongoimport,数据库是test,后面指定了文件源。这个工具的更详细介绍参考 https://docs.mongodb.org/manual/reference/program/mongoimport/#bin.mongoimport 。
通过Java操作MongoDB要用到俩jar包:Uber MongoDB Java Driver和BSON,官方给了maven集成方式:
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.0.4</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>bson</artifactId> <version>3.0.4</version> </dependency> </dependencies>
但是我尝试了不行,只能自己下载了。
访问数据库的方法如下:
MongoClient mongoClient = new MongoClient(); MongoDatabase db = mongoClient.getDatabase("test");
插入数据有四个方法:
我们试一下第三个
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CHINA); Document document = new Document("address", new Document("street", "avenue 2").append("zipcode", "200000").append("building", "1480").append( "coord", Arrays.asList(-73.9557413, 40.7720266))) .append("borough", "一个省") .append("Country", "中国") .append("grades", Arrays.asList(new Document() .append("date", format.parse("2014-10-01T00:00:00Z")) .append("grade", "A") .append("score", 11), new Document().append("date", format.parse("2014-01-16T00:00:00Z")) .append("grade", "B").append("score", 17))) .append("name", "Vella").append("hotel_id", "41704620"); database.getCollection("restaurants").insertOne(document);
之后我们把数据查询一下:
FindIterable<Document> iterable = db.getCollection("restaurants").find(); iterable.forEach(new Block<Document>() { @Override public void apply(final Document document) { System.out.println(document); } });
可以看到多了一个_id字段。
如果想有针对性的检索,可以传入一个文档:
FindIterable<Document> iterable = db.getCollection("restaurants").find( new Document("borough", "哈哈哈"));
(这个匹配失败了所以没有东西返回)
更新数据的方法也比较简单,第一个参数用来检索,第二个是新数据。
比如:
db.getCollection("restaurants").updateOne(new Document("restaurant_id", "41156888"), new Document("$set", new Document("address.street", "East 31st Street")));
将会更新address.street。
如果要改的字段太多,可以使用replaceOne
删除数据使用delete:
比如
db.getCollection("restaurants").deleteMany(new Document("borough", "Manhattan"));
全部删除的话可以
db.getCollection("restaurants").deleteMany(new Document());
连集合都不要的话可以
db.getCollection("restaurants").drop();
最后说一下索引的建立
db.getCollection("restaurants").createIndex(new Document("cuisine", 1));
使用createIndex,指定为哪个字段键索引,1是升序,-1是降序。
索引相关的方法有这些: