仅保留Mongo集合中的唯一值 - 子数组

时间:2013-09-04 19:16:25

标签: java mongodb database

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

2 个答案:

答案 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})