一、文档式非关系型数据库,插入与查询速度快,便于多元数据结构的数据存储;
二、过于松散的数据组织不利于后期的查询与计算,因此初期还是需要对文档结构做一定的约束;
三、可与Hadoop很好的结合,官方支持MongoDB Connector for Hadoop。后期计算如遇到瓶颈可以考虑数据库分片或者将数据查询迁移到 Map/Reduce框架中;
四、考虑到开发人员均有部分SQL和Java程序基础,采用MongoDB可以减轻学习成本,充分利用现有技能。具体包括:
- 会SQL的同学,可以考虑使用Query Translator将标准SQL转换为mongo查询语言
- 会Javascript的同学,mongo shell采用js作为内置语言,可以直接调用js标准库函数,方便查询MongoDB数据库
- 会Java的同学,可以使用UnityJDBC,该工具实现了JDBC接口,可以使用大部分标准SQL,驱动程序内部会将其转换为mongo查询语句。免去了学习MongoDB官方驱动API的时间。API使用方法如下:
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.*;
public class MongoDB {
public static void main(String[] args) throws Exception {
ClassLoader cl = ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(cl, new File("C:\\Program Files\\UnityJDBC\\mongodb_unityjdbc_full.jar").toURI().toURL());
Class.forName("mongodb.jdbc.MongoDriver");
String url = "jdbc:mongo://1.1.1.1:27017/test";
Connection con = DriverManager.getConnection(url, "", "");
Statement stmt = con.createStatement();
String sql = "SELECT * FROM data";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
int numColumns = meta.getColumnCount();
System.out.print(meta.getColumnName(1));
for (int j = 2; j <= meta.getColumnCount(); j++)
System.out.print(", " + meta.getColumnName(j));
System.out.println();
while (rs.next())
System.out.println(rs.getObject("address").getClass().isInstance(Class.forName("com.mongodb.BasicDBObject").newInstance()));
rs.close();
stmt.close();
con.close();
}
}
- UnityJDBC 不仅提供Java-API,还包含一个Java开发的GUI客户端,可以通过SQL方便的查询MongoDB中的数据。当然该工具目前是收费的…