通过 Java 操作 MongoDB

jopen 12年前
     <p>mongodb的java驱动已经提供比较全的操作,分为三块:</p>    <p>1.普通用户操作</p>    <p>2.管理员操作</p>    <p>3.oplog操作</p>    <p>具体可以添加一个eclipse testng插件,再在工程中导入testng.jar包即可看到。</p>    <p>本文主要说明各个使用点和注意事项。</p>    <p> </p>    <p>1.连接一个复制集(replica sets)mongod:</p>    <p>复制集是mongo解决稳定性的一个方案,也是可以实现读写分离的一种实现,这里介绍复制集的java连接方式。</p>    <pre class="brush:java; toolbar: true; auto-links: false;">    static Mongo m;          static {         List<ServerAddress> addresslist = new ArrayList<ServerAddress>();         try {             addresslist.add(new ServerAddress("127.0.0.1:10240"));             addresslist.add(new ServerAddress("127.0.0.1:11240"));             addresslist.add(new ServerAddress("127.0.0.1:12240"));         } catch (UnknownHostException e) {             System.err.println("address check error.");             System.exit(-1);         }                  MongoOptions options = new MongoOptions();         options.autoConnectRetry = true;         options.connectionsPerHost = 20;         options.connectTimeout = 6000;         options.maxAutoConnectRetryTime = 12000;         options.maxWaitTime = 12000;         options.socketKeepAlive = true;         options.socketTimeout = 2000;                  try {             m = new Mongo(addresslist, options);         } catch (MongoException e) {             System.err.println("mongo create error.");             System.exit(-1);         }     }</pre>注:一般例子采用的连接方式是直接连一个mongod服务,但是作为单台的生产环境显然安全性不足,因此采用复制集方式,连接也区别于一般,是使用    <pre class="brush:java; toolbar: true; auto-links: false;">        public Mongo( List<ServerAddress> replicaSetSeeds , MongoOptions options ) throws MongoException</pre>方法。    <p></p>    <p>MongoOptions根据自己的需求设置,参数说明已经很多了,不细讲。</p>    <p>注意mongo实例使用单例模式。</p>    <p> </p>    <p>2.获取db:</p>    <pre class="brush:cpp; toolbar: true; auto-links: false;">DB db = m.getDB("test");</pre>注:取到名为test的db进行操作;若该db不存在,该操作会创建对应的db。    <p></p>    <p> </p>    <p>3.获取集合:</p>    <pre class="brush:java; toolbar: true; auto-links: false;">DBCollection col = db.getCollection("offer");</pre>注:取名字为offer的集合;类似于db的表。    <p></p>    <p> </p>    <p style="color:#ff0000;">以上三个操作是建立连接,接下去才是db中常用的操作。</p>    <p> </p>    <p><span style="color:#000000;">4.查询:</span></p>    <pre class="brush:java; toolbar: true; auto-links: false;">        DBCursor cursor = col.find();         while(cursor.hasNext()) {          System.out.println(cursor.next());          i++;         }</pre>注:全集合查询,输出每条记录,正常情况不会作类似操作,记住两个东西,find()和cursor    <pre class="brush:java; toolbar: true; auto-links: false;">        BasicDBObject query = new BasicDBObject();         query = new BasicDBObject();         query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));  // i.e.   20 < i <= 30         <pre name="code" class="java">        DBCursor cur = coll.find(query);         while(cur.hasNext()) {             System.out.println(cur.next());         }</pre>注:查询指定条件的offer信息。    <pre class="brush:java; toolbar: true; auto-links: false;">DBObject tmpdoc = col.findOne(doc);</pre>注:查询单条记录;在很明确一条记录有且只有一条时,findOne()比较方便,免得游标移动麻烦。    <br />    <br />    <p></p>    <p><span style="color:#000000;"><br /> </span></p>    <p>5.更新:</p>    <pre class="brush:java; toolbar: true; auto-links: false;">DBObject tmpdoc = col.findOne(doc); tmpdoc.put("i", (Integer)tmpdoc.get("i")+1); System.out.println("update obj: " + col.findOne(tmpdoc));</pre>注:更新一条记录,先整个读出再更新部分信息再写入,    <span style="color:#ff0000;">切记不要读出一部分更新回去。</span>    <p></p>    <p> </p>    <span style="color:#000000;">6.插入:<pre class="brush:java; toolbar: true; auto-links: false;">int i=1000; BasicDBObject doc = new BasicDBObject(); doc.put("i", i+1); col.insert(doc); System.out.println("insert obj: " + col.findOne(doc));</pre></span>注:插入一条记录{i:1001},_id自动生成。    <br />    <p> </p>    <p>7.删除:</p>    <pre class="brush:java; toolbar: true; auto-links: false;">BasicDBObject doc = new BasicDBObject(); doc.put("i", i+1);    col.remove(doc); System.out.println("insert obj: " + col.findOne(doc));</pre>注:删除一条记录。    <p></p>    <p></p>    <p></p>    <p></p>    <p></p>    <p></p>