2015-12-18 2 views
-1

У меня есть эти данные на моей mongodb базы данных:Не может найти подпол

{ 
    "_id" : BinData(3, "bU0bX4VEAMnW7AJ28wXcoA=="), 
    "online" : false, 
    "money" : 0, 
    "rank" : "USER", 
    "ban" : { 
     "end" : NumberLong("3027259780628"), 
     "reason" : "hello" 
    } 
} 

и я использую этот код, чтобы получить доступ к ban.end подполу сохраненного в нем:

final Document doc = collcetion.find(new Document("_id", myId)). 
           projection(Projections.include("ban.end")); 
System.out.println(doc); // here is all ok. 
         // It print out the _id with the 
         // ban and the end values. 
final long a = doc.getLong("ban.end"); // nullptr exception because 
             // I tryied to do this: 
long a = (Long) null; 

Есть любой способ исправить сообщение null pointer? Я думаю, что мне не удалось что-то с mongodb, я не уверен в использовании ban.end в качестве имени поля.

Я уже пытался получить, например, значение money, и он работает.

+0

'Я tryied сделать это: долго = (Long) нуль;' Почему ?? Это даже не компилируется, поэтому я не уверен, как вы думаете, что генерирует нулевой указатель. – tnw

ответ

0

getLong возвращает Long, а не long. См. http://api.mongodb.org/java/current/org/bson/Document.html#getLong-java.lang.Object-.

Другими словами, вы получаете нулевой указатель, потому что вы неявно распаковываете его. Просто используйте

final long a = doc.getLong("ban.end"); 

вместо этого ручка нулевой регистр отдельно.

+0

Дело в том, что он всегда возвращает null, и он должен возвращать значение. Это проблема, мне не пришлось обрабатывать результат. – Lorenzo

0

Я не уверен в использовании имени «ban.end» в качестве имени поля.

К сожалению, вы находитесь. Прежде чем вы сможете получить доступ к своему атрибуту end, вам необходимо сначала получить objcect.

Логика остается неизменной для любых версий.

код в 3.0.4 версии драйвера java,

DBCursor docs = collection.find(new BasicDBObject("_id", myId), 
            new BasicDBObject("ban.end", 1)); 
while (docs.hasNext()) 
{ 
    BasicDBObject banObj = (BasicDBObject) docs.next().get("ban"); 
    long end = banObj.getLong("end"); 
    System.out.println(end); 
}