如何检索实体对象的嵌入列表?

时间:2012-12-03 11:59:34

标签: mongodb

我有一个简单的问题,即存储和检索嵌入的实体集合到mongo。我检查了这些问题:

how to serialize class?Mongodb saves list of object

我理解的是保存一个列表对象,该对象的类必须扩展ReflactionDBObject。这对于保存对象起作用,通过使用嵌入式集合检索它不起作用。

这里有一个简单的测试表明检索嵌入的实体不起作用!

@Test
  public void whatWasStoredAsEmbeddedCollectionIsRetrieved2() {

       BasicDBObject country = new BasicDBObject();

country.put("name", "Bulgaria");

List<City> cities = Lists.newArrayList(new City("Tarnovo"));

country.put("listOfCities", cities);

DBCollection collection = db().get().getCollection("test_Collection");

collection.save(country);

DBCursor object = collection.find(new BasicDBObject().append("name", "Bulgaria"));

DBObject returnedCity = object.next();

DBObject embeddedCities = (DBObject) returnedCity.get("listOfCities");

System.out.println(embeddedCities);
  }

这是City Class

class City extends ReflectionDBObject {

    String name;


    City() {
    }

    City(String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (!(o instanceof City)) return false;

      City city = (City) o;

      if (name != null ? !name.equals(city.name) : city.name != null) return false;

      return true;
    }

    @Override
    public int hashCode() {
      return name != null ? name.hashCode() : 0;
    }

    @Override
    public String toString() {
      return "City{" +
              "name='" + name + '\'' +
              '}';
    }

  }

System.out.println语句is [ { "_id" : null }]

的输出

现在怎样才能找回嵌入对象和嵌入列表呢?

1 个答案:

答案 0 :(得分:1)

如果您没有要求定义自己的City类,则可以使用BasicDBObjects定义子文档。我只在citySubDoc1和citySubDoc2中添加了“name”字段,但当然,您可以在这些子文档中添加更多字段。

    // Define subdocuments

    BasicDBObject citySubDoc1 = new BasicDBObject();
    citySubDoc1.put("name", "Tarnovo");    

    BasicDBObject citySubDoc2 = new BasicDBObject();
    citySubDoc2.put("name", "Sofia");

    // add to list

    List<DBObject> cities = new ArrayList <DBObject>();
    cities.add(citySubDoc1);
    cities.add(citySubDoc2);

    country.put("listOfCities", cities);

    collection.save(country);

    // Specify query condition 

    BasicDBObject criteriaQuery = new BasicDBObject();
    criteriaQuery.put("name", "Bulgaria");

   // Perform the read

    DBCursor cursor = collection.find(criteriaQuery);

    // Loop through the results
    try {
        while (cursor.hasNext()) {
           List myReturnedListOfCities = (List) cursor.next().get("listOfCities");
           System.out.println(myReturnedListOfCities);
       }
    } finally {
        cursor.close();
    }