请问使用JAVA如何读取存储在mongodb里面_data字段的二进制消息内容

zhangjie 8天前 131

使用JAVA如何读取存储在mongodb里面_data字段的二进制消息内容,如下是我的代码片段

public static void main(String[] args) {
        MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");
        MongoDatabase database = mongoClient.getDatabase("wfchat");
        MongoCollection<Document> collection = database.getCollection("t_messages_0");

        FindIterable<Document> documents = collection.find();
        for (Document doc : documents) {
            Binary bin = doc.get("_data", Binary.class);
            byte[] bytes = bin.getData();
            System.out.println(doc.toJson());
            System.out.println(bytes);
        }

        mongoClient.close(); // 在应用程序结束时关闭连接。
    }

打印的内容如下,

{"_id": 468869501027352705, "_from": "MandayNoticeRobot", "_type": 0, "_target": "00000000000001", "_line": 0, "_data": {"$binary": {"base64": "COsHEkJ7InVzZXJJZCI6IjAwMDAwMDAwMDAwMDAzMzUzMCIsInZpZXdTdGF0dXMiOiJOIiwibWVzc2FnZVVpZCI6bnVsbH0aHuS9oOeahOW3peS9nOaXpeaKpeaaguacquWhq+WGmTAAQANIAFAAakJ7InVzZXJJZCI6IjAwMDAwMDAwMDAwMDAzMzUzMCIsInZpZXdTdGF0dXMiOiJOIiwibWVzc2FnZVVpZCI6bnVsbH0=", "subType": "00"}}, "_content_type": 1003, "_dt": {"$date": "2025-01-31T08:00:00.438Z"}, "_searchable_key": "{\"userId\":\"0000000000001\",\"viewStatus\":\"N\",\"messageUid\":null}"}

[B@6a0ac48e
最新回复 (15)
  • x86 8天前
    引用 2
    请参考:

    https://bbs.wildfirechat.cn/thread-2421.htm

    https://bbs.wildfirechat.cn/thread-3076.htm
  • HeavyRain 8天前
    引用 3
    看一下https://gitee.com/wfchat/im-server/blob/wildfirechat/sdk/src/main/java/cn/wildfirechat/sdk/Main.java 这个里面的testReadMessageContentFromDB方法也行
  • zhangjie 4天前
    引用 4
    HeavyRain 看一下https://gitee.com/wfchat/im-server/blob/wildfirechat/sdk/src/main/java/cn/wildfirechat/sdk/Main.j ...
    为啥读取到的图片链接为null,还有就是自定义消息放在UnknownMessageContent没法读取
  • HeavyRain 3天前
    引用 5
    我们查一下
  • HeavyRain 3天前
    引用 6
    之前写的server端消息有些问题,我们重新修改了一下,现在每个消息在重写encode和decode方法时,必须先调用super的对应方法。请更新验证。
  • HeavyRain 3天前
    引用 7
    自定义消息需要自己来添加新的消息类型,普通消息参考文本消息,媒体类消息参考图片消息
  • zhangjie 3天前
    引用 8
    是要重新打包SDK么
  • HeavyRain 3天前
    引用 9
    需要
  • HeavyRain 3天前
    引用 10
    不需要动IM服务,只打包后用这个SDK就行
  • zhangjie 2天前
    引用 11
    HeavyRain 自定义消息需要自己来添加新的消息类型,普通消息参考文本消息,媒体类消息参考图片消息
    自定义的机器人发的消息呢,这个也参考文本消息么
  • HeavyRain 2天前
    引用 12
    是的
  • zhangjie 2天前
    引用 13
    怎么样让消息落到我自定义消息来呢,我拿TextMessageContent复制一份改个名字AutoMessageContent,那自定义消息还是落到了UnknownMessageContent去了,怎么落到AutoMessageContent(if(messageContent instanceof AutoMessageContent))呢
  • HeavyRain 2天前
    引用 14
    MessageContentFactory添加了一个注册自定义消息的接口,可以调用这个接口注册自定义消息,请参加注释:

    ```
            // 问题:MessageContentFactory是如何找到消息的?
            // 答:MessageContentFactory在启动时会扫描自己的包cn.wildfirechat.sdk.messagecontent下的所有MessageContent子类,记住子类和消息类型的对应关系。
            // 问题:自定义消息如何添加到MessageContentFactory中?
            // 答:首先自定义消息需要继承MessageContent,然后有2个选择,1是放到此SDK的cn.wildfirechat.sdk.messagecontent包下打包SDK;2是调用MessageContentFactory中的registerCustomMessageContent方法手动关联。
            // 比如 MessageContentFactory.registerCustomMessageContent(CustomTextMessageContent.class);
    ```
  • zhangjie 9小时前
    引用 15
    自定义类型的,如何记住子类和消息类型的对应关系,registerCustomMessageContent的参数里面也不能设置啊
  • HeavyRain 6小时前
    引用 16
     MessageContentFactory.registerCustomMessageContent(CustomTextMessageContent.class); 
    这样,函数里会获取到消息的类型,这样就把消息和类型对应保存下来了
返回