Cordys BOP 4平臺開發實戰——MongoDB提供文件服務(1)

肖永威發表於2015-04-09
        在Cordys平臺,使用WS-AppServer Package元件,新建C_MongoPackage自定義類。
        

1、查詢返回單個文件JSON資料

(1)查詢返回獨立文件

MongoDB語法:

.find({"ID":"2015040011"})

Soap請求:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP:Body>
    <FindDocuments xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">
      <collectionName>BusinessEntity</collectionName>
      <querycondition>{"ID":"2015040011"}</querycondition>
    </FindDocuments>
  </SOAP:Body>
</SOAP:Envelope>

返回值擷取內容如下:

<findDocuments>

{ "_id" : { "$oid" : "5525d9e084ae4890fc58c489"} , "ID" : "2015040011" , "Name" : "高階採購流程" , "Dept" : "經營管理部"}

</findDocuments>

(2)查詢返回巢狀文件

MongoDB語法:

.find({"ID":"2015040013"})

Soap請求:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP:Body>
    <FindDocuments xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">
      <collectionName>BusinessEntity</collectionName>
      <querycondition>{"ID":"2015040013"}</querycondition>
    </FindDocuments>
  </SOAP:Body>
</SOAP:Envelope>

巢狀文件查詢結果擷取主要內容如下:

<findDocuments>

{ "_id" : { "$oid" : "55260ce084ae4cb2fa2e2bea"} , "ID" : "2015040013" , "Name" : "新版合作伙伴採購流程" , "Dept" : "經營管理部" , "DETAIL" :

 [ { "WF" : "01" , "WFNAME" : "啟動"} , { "WF" : "02" , "WFNAME" : "結束"}]}

</findDocuments>


2、擴充套件/修改文件,返回文件_id

(1)插入單文件操作

MongoDB語法:

.save({"ID":"2015040012","Name":"新版外包採購流程","Dept":"經營管理部"})

Soap請求:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP:Body>
    <GetExpandDocument xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">
      <collectionName>BusinessEntity</collectionName>
      <JSONString>{"ID":"2015040012","Name":"新版外包採購流程","Dept":"經營管理部"}</JSONString>
    </GetExpandDocument>
  </SOAP:Body>
</SOAP:Envelope>

返回_id值如下:

<getExpandDocument>5525e34d84ae4cb2fa2e2be6</getExpandDocument>


(2)插入巢狀文件(相當於一對多關係)

MongoDB語法:

.save({ID:'2015040013',Name:'新版合作伙伴採購流程',Dept:'經營管理部',DETAIL:[{WF:'01',WFNAME:'啟動'},{WF:'02',WFNAME:'結束'}]})

Soap請求:

<GetExpandDocument xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">
      <collectionName>BusinessEntity</collectionName>
      <JSONString>{ID:'2015040013',Name:'新版合作伙伴採購流程',Dept:'經營管理部',DETAIL:[{WF:'01',WFNAME:'啟動'},{WF:'02',WFNAME:'結束'}]}</JSONString>
    </GetExpandDocument>


(3)修改資料,在_id值不變的情況下,執行修改操作

MongoDB語法:

.save({"_id":{"$oid":"5525d9e084ae4890fc58c489"},"ID":"2015040011","Name":"經領導外包採購流程","Dept":"經營管理部"})

Soap請求:

<GetExpandDocument xmlns="http://schemas.cordys.com/XiaoywWSAppServerPackage" preserveSpace="no" qAccess="0" qValues="">
      <collectionName>BusinessEntity</collectionName>
      <JSONString>{"_id":{"$oid":"5525d9e084ae4890fc58c489"},"ID":"2015040011","Name":"經領導外包採購流程","Dept":"經營管理部"}
      </JSONString>
</GetExpandDocument>


附件程式碼:

/*
  This class has been generated by the Code Generator
*/
package com.unicom.xiaoywwsappserverpackage;

import com.cordys.cpc.bsf.busobject.BusObjectConfig;
import com.cordys.cpc.bsf.busobject.BusObjectIterator;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.WriteResult;
import com.mongodb.util.JSON;


public class C_MongoPackage extends C_MongoPackageBase
{
    public C_MongoPackage()
    {
        this((BusObjectConfig)null);
    }

    public C_MongoPackage(BusObjectConfig config)
    {
        super(config);
    }
    /* 內部私有共享方法:用於連結資料庫,需要傳輸DB */
    private static DB connectDB(DB v_db){
        try {  
         MongoClientURI uri = new MongoClientURI("mongodb://使用者名稱:密碼@10.64.52.120:27017/資料庫名稱");
         MongoClient client =  new MongoClient(uri);      

         v_db = client.getDB("ayuming");
        } catch (Exception e) {  
                e.printStackTrace();  
        }
   
    return v_db;    
    }
    /* 查詢返回單個文件,輸入引數分別為Collection名稱、查詢條件 */
    public static String findDocuments(String collectionName, String querycondition)
    {
DB db = null;
String ret_str = null;

try {
db = connectDB(db);

DBCollection collection = db.getCollection(collectionName);


DBObject query = (BasicDBObject) JSON.parse(querycondition);
DBCursor dbCursor = collection.find(query);
int curCount = dbCursor.count();
if (curCount > 0){ 
            ret_str = dbCursor.next().toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
try {
db.requestDone();
db = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return ret_str;
    }

    public static BusObjectIterator<com.unicom.xiaoywwsappserverpackage.C_MongoPackage> getC_MongoPackageObjects(com.cordys.cpc.bsf.query.Cursor cursor)
    {
        // TODO implement body
        return null;
    }
        /* 儲存單個文件到資料庫中,輸入引數為Collection名稱、JSON格式的文件,支援巢狀模型 */
public static String getExpandDocument(String collectionName,String JSONString) {
DB db = null;
String ret_id = null;

try {
db = connectDB(db);
DBCollection collection = db.getCollection(collectionName);
DBObject query = (BasicDBObject) JSON.parse(JSONString);
WriteResult writeResult = collection.save(query);

ret_id = query.get("_id").toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
try {
db.requestDone();
db = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return ret_id;
}

    public void onInsert()
    {
    }

    public void onUpdate()
    {
    }

    public void onDelete()
    {
    }

}

注:此程式碼只是PoC使用,請完善加入日誌處理等必要功能再使用到生產環境上。


參考及相關:

雲端計算統一辦公運營平臺服務能力設計方案》 肖永威 2014.11

用MongoDB資料庫來管理辦公系統中文件型的表單和資訊——通用流程化應用審批單設計思路(二,續)》 肖永威 2015.01

相關文章