--- 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"
}]
}
}
让我们了解它是如何运作的,
我们坚持一个业务对象,它有一个子业务和一个组。数据库可能已经知道了Business对象,如果是这种情况,那么我们不会保存它两次。同样的逻辑适用于子业务和组。该集合只应向我们展示独特的商业信息。
如果我能提供更多信息,请告诉我。我已经在圈子里跑了一天,现在试图让这个看似的简单任务完成。
除了addSubBusiness和addGroupForSubBusiness方法之外的所有东西都已存在,我正在努力添加这个新部分,所以我正在重构这个以满足我的需求。
答案 0 :(得分:1)
我对你的课程并不熟悉,但看起来你的addGroupsForSubBusiness方法似乎需要改为:
private void addGroupsForSubBusiness(SubBusiness sub, DBObject dbObj){
BasicDBList groups = new BasicDBList();
for (Group group: sub.getGroups()) {
DBObject dbGroupObj = new BasicDBObject();
dbGroupObj.put("group", group.getName());
groups.add(dbGroupObj);
}
dbObj.put("groups", groups);
}
}
您的子业务方法也发生了类似的变化,因为您现在拥有它,您的方法会循环遍历您的业务的子业务,但最后只添加一个对象,即最后一个子业务。
您是否也只会坚持一次这项业务?或者你可以多次为业务调用持久性,如第一次为业务“ABC”,子业务“sub1”,然后另一次业务“ABC”和子业务“sub2”,在这种情况下,你想要附加到现有文档。如果您的Business对象是完整的(因为在调用persist时对象包含其所有子实体和组),那么我认为上面提到的方法更改应该有所帮助。此外,您可以使用save()方法,因为您确定在_id字段上存在。 http://docs.mongodb.org/manual/reference/method/db.collection.save/
答案 1 :(得分:0)
如果您只需要一个子业务和一个组,那么最好将文档重组为以下内容:
{_id:"business_val", sub_business:"sub_business_val", group:"group_val"}
您的代码应如下所示:
new BasicDBObject().append("_id", "business_val").append("sub_business", "sub_business_val").append("group", "group_val");
此外,您需要使用以下方法确保集合的唯一索引:
db.[your_collection].ensureIndex({_id:1,sub_business:1,group:1},{unique:true})