Я использую MongoDB с драйвером Java.
Я написал запрос, который находит минимальный год для каждого региона в данных.
Полный код:
public void minYearPerRegion() {
for (int i = 0; i < uniqueRegions.size(); i++) {
BasicDBObject query = new BasicDBObject("Region", uniqueRegions.get(i));
BasicDBObject field = new BasicDBObject("Year", 1)
.append("Region", 1)
.append("Population", 1);
cursor = coll.find(query,field).sort(new BasicDBObject("Year",1)).limit(1);
try {
List<DBObject> documents = new ArrayList<DBObject>();
for (DBObject dbObject : cursor) {
DBObject o = cursor.next();
documents.add(o);
}
System.out.println("Document contains: " + documents.size() + " document/s");
} finally {
cursor.close();
}//end finally
}//end for
}//end minYearPerRegion
Я пытаюсь сохранить мои результаты как отдельные документы, но курсор, кажется, представляет его как объект. Я попытался разделить объект, выполнив следующее:
List<DBObject> documents = new ArrayList<DBObject>();
for (DBObject dbObject : cursor) {
DBObject o = cursor.next();
documents.add(o);
}
System.out.println("Document contains: " + documents.size() + " document/s");
Однако в строке печати всегда указывается, что список документов содержит только один документ, когда он должен содержать 4 (так как есть четыре уникальные области).
Скажите, пожалуйста, как получить каждый документ отдельно от курсора и сохранить его в массиве или списке.
Вы можете вызвать toArray()
который интуитивно возвращает List<DBObject>
. Вы возвращаете один документ, потому что вы передали limit(1)
курсору.
Я нашел решение своей попытки. Проблема заключалась в том, что documents
List опустошались каждый раз, когда цикл for выполнялся из-за строки:
List<DBObject> documents = new ArrayList<DBObject>();
Чтобы решить эту проблему, я просто удалил List из цикла for так:
public void minYearPerRegion() {
List<DBObject> documents = new ArrayList<DBObject>(); //<<<<<<<<<<<<<<<<
for (int i = 0; i < uniqueRegions.size(); i++) {
BasicDBObject query = new BasicDBObject("Region", uniqueRegions.get(i));
BasicDBObject field = new BasicDBObject("Year", 1)
.append("Region", 1)
.append("Population", 1);
cursor = coll.find(query,field).sort(new BasicDBObject("Year",1)).limit(1);
try {
for (DBObject dbObject : cursor) {
DBObject o = cursor.next();
documents.add(o);
}
System.out.println("Document contains: " + documents.size() + " document/s");
} finally {
cursor.close();
}//end finally
}//end for
}//end minYearPerRegion