--- Business
--- Sub-Business
--- Organization Group
我有一个像这样的数据结构,我想坚持到 Mongo 中。我不想保留重复的子业务,也不想保留重复的组织组。我将业务用作“_id”,因此那里不会有任何重复。
这是两个类,persist 在一个类中,其他方法在另一个类中。我的意思是代码有效,但它没有给我的多个组。
我可能不太了解 Mongo/Java,无法让它做我想做的事。
这是我所拥有的
public void persist(Business business) {
DB db = pool.getConnection();
LOG.info("Business toString: " + business.toString()); // REMOVE AFTER
try {
db.requestStart();
DBObject dbObjSetColumns = writeConverter.convert(business);
DBCollection dbCol = db.getCollection(BUSINESS_COLLECTION);
DBObject update = new BasicDBObject("$set",dbObjSetColumns);
DBObject query = new BasicDBObject("_id", business.getName());
LOG.debug(query.toString());
LOG.debug(update.toString());
dbCol.update(query, update, true, false);
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
if (db != null) {
db.requestDone();
}
}
}
public DBObject convert(Business business) {
if (business == null) {
return null;
}
final DBObject dbObj = new BasicDBObject();
this.addSubBusinesses(business,dbObj);
return dbObj;
}
private void addSubBusinesses(Business b, DBObject dbObj){
BasicDBObject subBusiness = new BasicDBObject();
for(SubBusiness sub : b.getSubBusinesses()){
subBusiness.put("name", sub.getName());
if(sub.getGroups() != null){
this.addGroupsForSubBusiness(sub, subBusiness);
}
}
dbObj.put("subBusiness", subBusiness);
}
private void addGroupsForSubBusiness(SubBusiness sub, DBObject dbObj){
BasicDBList groups = new BasicDBList();
final DBObject dbGroupObj = new BasicDBObject();
dbGroupObj.put("group", sub.getName());
groups.add(dbGroupObj);
dbObj.put("groups", groups);
}
这是我收到的。幸运的是,它似乎没有复制 subBusiness,但我确实有多个组,这里没有出现。
/* 0 */
{
"_id" : "ABC",
"subBusiness" : {
"name" : "subBus",
"groups" : [{
"group" : "Ground"
}]
}
}
/* 1 */
{
"_id" : "XYZ",
"subBusiness" : {
"name" : "Sub2",
"groups" : [{
"group" : "Air"
}]
}
}
从这个角度来看这是如何工作的,
我们坚持一个业务对象,它有一个子业务和一个组。数据库可能已经知道业务对象,如果是这种情况,那么我们不会保存它两次。相同的逻辑适用于子业务和组。该集合应该只向我们展示独特的商业信息。
如果我可以提供更多信息,请告诉我。我已经在圈子里跑了一天,试图完成这个看似简单的任务。
除了 addSubBusiness 和 addGroupForSubBusiness 方法之外的所有东西都已经存在,我正在努力添加这个新部分,所以我正在重构它以满足我的需要。