使用Java在MongoDB中存储字节[]

使用Java在MongoDB中存储字节[],java,mongodb,Java,Mongodb,我将一个文档插入到一个字段为byte[]的集合中。当我查询插入的文档以获取该字段时,它返回一个不同的字节[]。我该如何解决这个问题 byte[] inputBytes = ... MongoCollection<Document> collection = _db.getCollection("collectionx"); Document doc = new Document("test", 1).append("val", inputBytes); collection.ins

我将一个文档插入到一个字段为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
byte[]inputBytes=。。。
MongoCollection集合=_db.getCollection(“collectionx”);
文档文档=新文档(“测试”,1)。追加(“val”,输入字节);
collection.insertOne(doc.getDocument());
MongoCursor结果=collection.find(eq(“test”,1)).iterator();
文档检索_doc=cursor.next();
cursor.close();
字节[]输出字节=((二进制)检索的_doc.get(“val”)).getData();
//inputBytes=[B@719f369d
//outputBytes=[B@7b70cec2

您可以对字节数组进行编码并将其存储在文档中,也可以在提取后对其进行解码以检索原始数据

static String   encodeBase64String(byte[] binaryData)
使用base64算法对二进制数据进行编码,但不分块输出

static byte[]   decodeBase64(String base64String)
将Base64字符串解码为八位字节


请参阅此链接-

问题不在于您的代码,而在于如何检查两个数组(输入数组和输出数组)是否相等。似乎您只是在比较调用
toString()
对两个结果的结果。但是
toString()
对于数组类型不被重写,因此它实际上只是返回对象的类型和哈希代码:

类对象的toString方法返回一个字符串,该字符串由 对象作为实例的类的名称,at符号 字符“@”和哈希的无符号十六进制表示形式 对象的代码。换句话说,此方法返回一个等于 价值:

getClass().getName() + '@' + Integer.toHexString(hashCode())
所以
[B@719f369d
表示:“字节数组”(
[B
)和哈希代码
0x719f369d
。它与数组内容无关

在您的示例中,输入和输出数组是两个不同的对象,因此它们具有不同的内存地址和哈希代码(因为
hashCode()
也不会被数组类型覆盖)

解决方案

如果要比较两字节数组的内容,请调用


如果要打印字节数组的内容,请调用将内容转换为人类可读的
字符串

MongoDB支持
org.bson.types.Binary
类型

您可以使用:

BasicDBObject(“\u id”,二进制(session.getIp().getAddress())


二进制比较将起作用

什么是“不同”?您能发布预期结果与实际结果吗?预期outputBytes与InputBytes相同,但您只是将
与字符串()进行比较
-输入和输出数组的结果。这些数组只反映了它们在内存中的地址,而不是它们的内容。为什么您认为这些地址应该是相同的?所以mongo不支持[]字节…我越是了解这个数据库,我就越讨厌它。使用org.bson.types.Binary。例如:新文档(“数据”,新二进制(byteArray));尽管如此,在我看来,它在数据库中保存为base64。不特别节省空间。