. 连接MongoDB数据库
```java
import com.mongodb.Mongo;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import com.mongodb.MongoAdmin;
// 创建Mongo对象,传入数据库地址和端口号(可选)
Mongo db = new Mongo("localhost", "mydb");
// 或者传入数据库名称
Mongo db = new Mongo("localhost", 27017, "mydb");
```
2. 查看MongoDB数据库列表
```java
Mongo m = new Mongo();
for (String s : m.getDatabaseNames()) {
System.out.println(s);
}
```
3. 删除一个数据库
```java
Mongo m = new Mongo();
m.dropDatabase("myDatabaseName");
```
4. MongoDB安全验证(非必选)
在JAVA中可使用如下方法连接:
```java
boolean auth = db.authenticate(userName, password);
if (auth) {
System.out.println("Authentication successful");
} else {
System.out.println("Authentication failed");
}
```
如果用户名密码验证通过,返回值为true,否则为false。
5. 获取集合列表
```java
Set
for (String s : colls) {
System.out.println(s);
}
```
6. 获得一个集合
```java
DBCollection coll = db.getCollection("testCollection");
```
当你获取了这个集合对象,你就可以对数据进行增删查改之类的操作。
以下是重构后的代码:
```java
// 获取集合索引信息
List
for (DBObject o : list) {
System.out.println(o);
}
// 插入文档,默认ID
// 当保存的对象没有设置ID时,mongoDB会默认给该条记录设置一个ID("_id")。
// 当然你也可以设置自己指定的ID,如:(在mongoDB中执行用db.users.save({_id:1,name:'bruce'});)
// 当你获得了一个集合对象,你就可以把文档插入到这个对象中。例如,存在一个JSON式的小文档:
// {
// "name" : "MongoDB",
// "type" : "database",
// "count" : 1,
// "info" : {
// x : 203,
// y : 102
// }
// }
// 请注意,这个文档包含一个内部文档。我们可以使用BasicDBObject类来创建这个文档,并且使用insert()方法方便地将它插入到集合中。
BasicDBObject doc = new BasicDBObject();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);
BasicDBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);
doc.put("info", info);
coll.insert(doc);
// 批量插入
List
for (int i = 0; i < 100; i++) {
BasicDBObject bo = new BasicDBObject();
bo.put("name", "bruce");
bo.append("age", i);
datas.add(bo);
}
```
以下是重构后的内容:
1. 插入文档到集合中:
```java
coll.insert(datas);
```
2. 使用findOne()查找集合中第一个文档:
```java
DBObject myDoc = coll.findOne();
System.out.println(myDoc);
```
返回类似:
```json
{
"_id" : "ac907a1f5b9d5e4a233ed300",
"name" : "MongoDB",
"type" : 1,
"info" : {
"x" : 203,
"y" : 102
},
"_ns" : "testCollection"
}
```
注意_id和_ns元素是由MongoDB自动加入你的文档。记住:MongoDB内部存储使用的元素名是以“_”做为开始。
3. 加入多种文档到集合中:
```java
for(int i = 0; i < 100; i++){
coll.insert(new BasicDBObject().append("i", i));
}
```
可以通过循环来实现。注意我们可以在一个集合中插入不同类型的文档,这就是我们所说的“模式自由”(schema-free)。
4. 统计集合中的文档数量:
```java
System.out.println(coll.getCount());
```
5. 使用光标(cursor)来获取全部文档:
```java
DBCursor cur = coll.find();
while(cur.hasNext()){
System.out.println(cur.next());
}
```
为了获取集合中的所有文档,我们可以使用find()方法。这个方法返回一个DBCursor对象,来允许我们将符合查询条件的文档迭代出来。
我们可以创建一个查询,并传递给find()方法来获取集合中所有文档的一个子集。例如,我们想要查询域名为"i",并且值为71的文档:
```java
BasicDBObject query = new BasicDBObject();
query.put("i", 71);
Cursor cur = coll.find(query);
while (cur.hasNext()) {
System.out.println(cur.next());
}
```
类转换:
当把一个类对象存到mongoDB后,从mongoDB取出来时使用setObjectClass()将其转换回原来的类。
```java
public class Tweet implements DBObject {
/* ... */
}
Tweet myTweet = new Tweet();
myTweet.put("user", "bruce");
myTweet.put("message", "fun");
myTweet.put("date", new Date());
collection.insert(myTweet);
//转换
collection.setObjectClass(Tweet.class);
Tweet myTweet = (Tweet) collection.findOne();
```
11. 使用条件查询获取集合:
比较符:
- "$gt":大于
- "$gte":大于等于
- "$lt":小于
- "$lte":小于等于
- "$in":包含
例如,我们想要查询所有i>50的文档:
```java
BasicDBObject query = new BasicDBObject();
query.put("i", new BasicDBObject("$gt", 50));
Cursor cur = coll.find(query);
while (cur.hasNext()) {
System.out.println(cur.next());
}
```
以下是重构后的代码:
```java
import com.mongodb.BasicDBObject;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.util.regex.Pattern;
public class MongoDBDemo {
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection
// 查询名字匹配 joh?n 的记录,不区分大小写
Pattern pattern = Pattern.compile("joh?n", Pattern.CASE_INSENSITIVE);
BasicDBObject query = new BasicDBObject("name", pattern);
DBCursor cursor = collection.find(query);
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
// 创建索引
collection.createIndex(new BasicDBObject("i", 1));
// 获取索引列表并打印
List
for (DBObject o : indexList) {
System.out.println(o);
}
}
}
```
以下是重构后的代码:
```java
public class Tweet implements DBObject {
// ...
}
// 创建Tweet对象并设置属性
Tweet myTweet = new Tweet();
myTweet.put("user", userId);
myTweet.put("message", message);
myTweet.put("date", new Date());
// 将Tweet对象插入到MongoDB集合中
collection.insert(myTweet);
// 从MongoDB集合中取出文档并将其转换为DBObject接口类型
collection.setObjectClass(Tweet.class);
Tweet retrievedTweet = (Tweet) collection.findOne();
```
关于JAVA驱动的并发性,可以参考以下代码:
```java
// 创建一个单例的MongoDB驱动实例
Mongo m;
m.restartStart();
// ... 其他代码 ...
m.requestDone();
```