Я пытаюсь получить одно конкретное поле ("Versions.id") из mongo с помощью java
Монго запрос - db.getCollection('SettlementInstance').find({"_id.timeSlice" : [2018,1,1], "_id.type" : "TRANSMISSION"})
Это данные, хранящиеся в коллекции mongo. Я хочу получить "id" : "3d8a3b31-aaa0-4c2e-82b3-5eaaa80d80e1" с помощью java
{
"_id" : {
"timeSlice" : [
2018,
1,
1
],
"type" : "TRANSMISSION",
"@objectName" : "SettlementInstance"
},
"Versions" : [
{
"id" : "3d8a3b31-aaa0-4c2e-82b3-5eaaa80d80e1",
"status" : "ACTIVE",
"version" : NumberLong(11447)
}
]
}
Программа Java, которую я пытался получить из поля «id» в объекте «Версии», выдает исключение.
String feedName = "ServicePointInputAdapter";
Mongo mongo = new Mongo(host);
DB db = mongo.getDB(("dbname"));
DBCollection collection = db.getCollection("SettlementInstance");
BasicDBObject whereQuery = new BasicDBObject();
whereQuery.put("_id.type", "TRANSMISSION");
whereQuery.put("_id.timeSlice", Arrays.asList(2018,1,1));
DBCursor cursor = collection.find(whereQuery);
try {
while (cursor.hasNext()) {
DBObject Features = cursor.next();
BasicDBList features = (BasicDBList) Features.get("Versions");
BasicDBObject[] featuresArr = features.toArray(new BasicDBObject[0]);
for (BasicDBObject dbobj : featuresArr) {
***** BasicDBObject si_id = (BasicDBObject) dbobj.get("id"); ***** //Getting error in the line }
}
} finally {
cursor.close();
}
}
}
К сожалению, я получаю исключение, например -
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.BasicDBObject.
Может ли кто-нибудь помочь мне решить проблему и получить поле «Versions.id» из коллекции.




Поскольку ошибка четко говорит о том, что вы пытаетесь преобразовать java.lang.String в com.mongodb.BasicDBObject, который выбрасывает java.lang.ClassCastException
Измените строку кода, как показано ниже (поскольку BasicDBObject реализует HashMap):
for (BasicDBObject dbobj : featuresArr) {
String id = (String)((HashMap)dbobj).get("id");
System.out.println(id);
}
Приведите BasicDBObject к HashMap и получите от него идентификатор.
@janopan Спасибо, что отметили ответ как правильный. Кроме того, не могли бы вы проголосовать за это?
Этот метод get () возвращает только значение. Значит, когда ты это делаешь, это была строка
dbobj.get("id")
Вы должны передать имя поля в качестве параметра, и вы получите значение. Так что измените эту строку, как показано ниже
BasicDBObject si_id = (BasicDBObject) dbobj.get("id");
to
String dbObjectId = dbobj.get("id");
Я уже пробовал как String и пытался распечатать si_id - Программа распечатала всю часть в таких версиях, как - {"id": "3d8a3b31-aaa0-4c2e-82b3-5eaaa80d80e1", "status": "ACTIVE", "version" : 11447} Я специально хочу, чтобы было напечатано поле "id"
пробовали ли вы использовать только этот DBObject Features = cursor.next (); в цикле hasNext () ?. Вы можете напрямую получить результаты там.
Я уже пробовал как String и пытался распечатать si_id - Программа распечатала всю часть в таких версиях, как - {"id": "3d8a3b31-aaa0-4c2e-82b3-5eaaa80d80e1", "status": "ACTIVE", "version" : 11447} Я специально хочу, чтобы было напечатано поле "id".