1
--- Business
   --- Sub-Business
      --- Organization Group

Mongo に保持したいこのようなデータ構造があります。重複するサブビジネスを保持したくありません。また、重複した組織グループを保持したくありません。ビジネスを「_id」として使用しているため、重複はありません。

これらは 2 つのクラスです。persist は 1 つのクラスにあり、他のメソッドは別のクラスにあります。つまり、コードは機能しますが、複数のグループを提供していません。

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

これが私が受け取っているものです。幸い、サブビジネスが重複しているようには見えませんが、ここには表示されていない複数のグループがあります。

/* 0 */
{
  "_id" : "ABC",
  "subBusiness" : {
    "name" : "subBus",
    "groups" : [{
        "group" : "Ground"
      }]
  }
}

/* 1 */
{
  "_id" : "XYZ",
  "subBusiness" : {
    "name" : "Sub2",
    "groups" : [{
        "group" : "Air"
      }]
  }
}

これがどのように機能するかを概観すると、

1 つのサブビジネスと 1 つのグループを持つ 1 つのビジネス オブジェクトを永続化します。データベースはすでにビジネス オブジェクトを認識している可能性があります。その場合は、2 回保存しません。同じ論理がサブ ビジネスとグループに適用されます。コレクションは、固有のビジネス情報のみを表示する必要があります。

他に提供できる情報があれば教えてください。私は、この一見簡単なタスクを完了しようとして、丸一日走ってきました。

addSubBusiness メソッドと addGroupForSubBusiness メソッドを除くすべてが既に存在していました。この新しい部分を追加する作業を行っているところなので、ニーズを満たすためにこれをリファクタリングしています。

4

2 に答える 2