2015-06-01 58 views
2

我將文檔插入字段爲byte []的集合中。當我查詢插入的文檔以獲取該字段時,它將返回不同的字節[]。我如何解決這個問題?使用Java在MongoDB中存儲byte []

byte[] inputBytes = ... 

MongoCollection<Document> collection = _db.getCollection("collectionx"); 
Document doc = new Document("test", 1).append("val", inputBytes); 
collection.insertOne(doc.getDocument()); 

MongoCursor<Document> result = collection.find(eq("test", 1)).iterator(); 
Document retrived_doc = cursor.next(); 
cursor.close(); 

byte[] outputBytes = ((Binary)retrived_doc.get("val")).getData(); 

// inputBytes = [[email protected] 
// outputBytes = [[email protected] 
+0

什麼是 '不同'?你能發佈預期與實際結果嗎? – isnot2bad

+0

期望outputBytes與inputBytes相同 – sanchapereira

+3

但您只是比較輸入和輸出數組的'toString()'結果。這些只是反映他們在內存中的地址,而不是其內容。你爲什麼認爲這些地址應該是相同的? – isnot2bad

回答

2

的問題是不是你的代碼,但你如何檢查,如果兩個數組 - 輸入和輸出數組 - 相等。看起來你只是比較兩個結果中調用toString()的結果。但toString()是沒有覆蓋數組類型,因此它實際上是Object.toString()剛剛返回對象的類型和散列碼:

Object類的toString方法返回由 類的名稱的字符串該對象是一個實例,符號 字符「@」以及該對象的代碼的散列 的無符號十六進制表示。換句話說,此方法返回一個字符串等於 到的值:與散列碼0x719f369d「字節的數組」([B):

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

[[email protected]所以裝置。它與數組內容無關。

在您的示例中,輸入和輸出數組是兩個不同的對象,因此它們具有不同的內存地址和散列碼(由於事實上hashCode()也未覆蓋數組類型)。

解決方案

如果要比較兩個字節數組的內容,請致電Arrays.equals(byte[], byte[])

如果您想打印一個字節數組的內容,呼籲Arrays.toString(byte[])的內容轉換爲人類可讀的String

2

MongoDB的驅動程序支持org.bson.types.Binary

BasicDBObject("_id", Binary(session.getIp().getAddress()))