MongoDB[Java]: Как запросить сохраненный UUID в формате byte[ ]?

Я пытаюсь запросить java.util.UUID, хранящийся в моем MongoDB, используя byte[], который соответствует той же строке, на которой основан хранимый UUID.

Я видел, что драйвер Mongo автоматически преобразует UUID в байты и сохраняет его как BinData(подтип,). Вот код, который я использовал для сохранения UUID:

        UUID originalUUID= UUID.fromString("7ee973c0-54b5-11e4-aaed-0002a5d5c51b");
        MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
        DB db = mongoClient.getDB("test");
        DBCollection coll = db.getCollection("test");

        BasicDBObject query = new BasicDBObject("_id", originalUUID);
        coll.save(query);

Я знаю, что мы можем легко получить этот документ с помощью объекта UUID в качестве значения в BasicDBObject, но я бы хотел использовать вместо него byte[]. В конце концов, в моем Монго должны быть байты, верно? Я знаю несколько сложностей, возникающих из-за того, что Java испортила порядок байтов перед отправкой его в Mongo, но я не смогла заставить его работать. Мой код для поиска здесь:

        String stringOne = "7ee973c0-54b5-11e4-aaed-0002a5d5c51b"; 
        // It's the same UUID String

        BasicDBObject find = new BasicDBObject("_id", stringOne.getBytes());

        DBCursor cursor = null;
        cursor = coll.find(find);
        while(cursor.hasNext()){
            BasicDBObject dbObject = (BasicDBObject)cursor.next();
            byte[] received = (byte[])dbObject.get("_id");
            System.out.println(new String(received));
        }

Я также попробовал Little Endian кодирование следующим образом:

        byte[] bytes = new byte[16];
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        bb.order(ByteOrder.LITTLE_ENDIAN);

        bb.putLong(originalUUID.getMostSignificantBits());
        bb.putLong(originalUUID.getLeastSignificantBits());

        BasicDBObject find = new BasicDBObject("_id", bb.array()); //Also tried flipping bb.

Ничего из этого не сработало. Может кто-нибудь дать некоторое представление об этом, с решением?

Спасибо!

1 ответ

Ты очень близко Единственная причина, по которой он не работает, заключается в том, что сопоставитель запросов также совпадает с подтипом двоичного файла. Попробуйте это вместо этого:

    UUID originalUUID = UUID.fromString("7ee973c0-54b5-11e4-aaed-0002a5d5c51b");
    MongoClient mongoClient = new MongoClient();
    DB db = mongoClient.getDB("test");
    DBCollection coll = db.getCollection("test");

    BasicDBObject query = new BasicDBObject("_id", originalUUID);
    coll.save(query);

    byte[] bytes = new byte[16];
    ByteBuffer bb = ByteBuffer.wrap(bytes);
    bb.order(ByteOrder.LITTLE_ENDIAN);

    bb.putLong(originalUUID.getMostSignificantBits());
    bb.putLong(originalUUID.getLeastSignificantBits());

    System.out.println(coll.findOne(originalUUID));
    System.out.println(coll.findOne(new Binary(Bytes.B_UUID, bb.array())));  // note use of the B_UUID subtype

Следует напечатать:

    { "_id" : { "$uuid" : "7ee973c0-54b5-11e4-aaed-0002a5d5c51b"}}
    { "_id" : { "$uuid" : "7ee973c0-54b5-11e4-aaed-0002a5d5c51b"}}
Другие вопросы по тегам