1
--- 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 方法之外的所有东西都已经存在,我正在努力添加这个新部分,所以我正在重构它以满足我的需要。

4

2 回答 2

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);
  }

}

您的 subBusiness 方法中的类似更改,因为您当前拥有它,您的方法循环通过您的 Business 的 subBusinesses,但最后只添加一个对象,即最后一个 subBusiness。

你还会为企业坚持一次吗?或者您是否可以多次为业务调用persist,例如第一次为业务“ABC”调用子业务“sub1”,然后再为业务“ABC”和子业务“sub2”调用一次,在这种情况下,您想要附加到现有文档。如果您的业务对象是完整的(因为当您调用persist 时对象包含其所有子业务和组),那么我认为上面提到的方法更改应该会有所帮助。此外,您可以使用 save() 方法,因为您确定存在 _id 字段。 http://docs.mongodb.org/manual/reference/method/db.collection.save/

于 2013-09-06T18:21:05.303 回答
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})
于 2013-09-05T12:21:15.697 回答