我将文档插入到一个字节为[]字段的集合中。当我查询插入的文档以获取该字段时,它返回不同的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 = [B@719f369d
// outputBytes = [B@7b70cec2
答案 0 :(得分:3)
您可以对字节数组进行编码并将其存储在doc中,并在解压缩后对其进行解码以检索原始数据。
static String encodeBase64String(byte[] binaryData)
使用base64算法对二进制数据进行编码,但不会对输出进行分块。
static byte[] decodeBase64(String base64String)
将Base64字符串解码为八位字节。
请参阅此链接 - https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html
答案 1 :(得分:3)
问题不是你的代码,而是你如何检查两个数组 - 输入和输出数组 - 是否相等。您似乎只是在两个结果上比较调用toString()
的结果。但是toString()
没有被数组类型覆盖,所以它实际上是Object.toString()
,它只返回一个对象的类型和哈希码:
Object类的toString方法返回一个由。组成的字符串 对象是实例的类的名称,at-sign 字符`@&#39;,以及散列的无符号十六进制表示 对象的代码。换句话说,此方法返回一个相等的字符串 价值:
getClass().getName() + '@' + Integer.toHexString(hashCode())
所以[B@719f369d
表示:&#39;字节数组&#39; ([B
),哈希码为0x719f369d
。它与数组内容无关。
在您的示例中,输入和输出数组是两个不同的对象,因此它们具有不同的内存地址和哈希代码(由于事实上,hashCode()
也未被数组类型覆盖)。
<强>解决方案强>
如果要比较两个字节数组的内容,请调用Arrays.equals(byte[], byte[])
。
如果要打印字节数组的内容,请调用Arrays.toString(byte[])
将内容转换为人类可读的String
。
答案 2 :(得分:3)
MongoDB支持org.bson.types.Binary
类型
您可以使用:
BasicDBObject("_id", Binary(session.getIp().getAddress()))
二进制比较将允许它