Поиск в коллекции MongoDB по полю типа UUID в Java не работает - PullRequest
0 голосов
/ 11 декабря 2018

В моей тестовой базе данных есть следующая коллекция (на самом деле есть только один документ):

> use test-mj
switched to db test-mj
> db.getCollection("test-collection").find()
{ "_id" : ObjectId("5c0e4a1496f5972da5bf0812"), "external_id" : UUID("21a4ec85-3cd2-40a4-8f3e-36aece6f38fc"), "name" : "abc" }
>

Нет проблем с итерацией по документам, поиск по ObjectId или другому простому строковому полю, но я могу 'найти этот документ даже при попытке найти по полю UUID.У меня есть следующий код Java:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.UUID;

import org.bson.BsonBinarySubType;
import org.bson.Document;
import org.bson.types.Binary;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;

public class MongoFindTest {

    public static void main(String[] args) {
        MongoClient mongoClient = new MongoClient("localhost", 27017);
        MongoDatabase db = mongoClient.getDatabase("test-mj");
        MongoCollection<Document> docList = db.getCollection("test-collection");

        FindIterable<Document> fi = docList.find();
        MongoCursor<Document> collCursor = fi.iterator();
        while (collCursor.hasNext()) {
            System.out.println(collCursor.next().toJson());
        }

        String uuidString = "21a4ec85-3cd2-40a4-8f3e-36aece6f38fc";
        UUID uuid = UUID.fromString(uuidString);

        byte[] bytes = new byte[16];
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        bb.order(ByteOrder.BIG_ENDIAN);
        bb.putLong(uuid.getMostSignificantBits());
        bb.putLong(uuid.getLeastSignificantBits());

        hexDump(bb.array());

        Binary bin = new Binary(BsonBinarySubType.UUID_LEGACY, bb.array());

        Document f3 = docList.find(com.mongodb.client.model.Filters.eq("external_id", bin)).first(); // Why this query doesn't find a document???
        if (null != f3) {
            f3.entrySet().stream().forEach(
                    (e -> System.out.println("find by UUID :: Key: " + e.getKey() + ", value: " + e.getValue())));
        }

        mongoClient.close();
    }

    public static void hexDump(byte[] msg) {
        System.out.println("================================================================");
        for (int j = 1; j < msg.length + 1; j++) {
            if (j % 16 == 1 || j == 0) {
                System.out.format("0%d\t|\t", j / 16);
            }
            System.out.format("%02X ", msg[j - 1]);
            if (j % 8 == 0) {
                System.out.print(" ");
            }
        }
        System.out.println();
        System.out.println("================================================================");
    }

}

Вывод выглядит следующим образом:

{ "_id" : { "$oid" : "5c0e4a1496f5972da5bf0812" }, "external_id" : { "$binary" : "pEDSPIXspCH8OG/OrjY+jw==", "$type" : "03" }, "name" : "abc" }
================================================================
00  |   21 A4 EC 85 3C D2 40 A4  8F 3E 36 AE CE 6F 38 FC  
================================================================

Двоичный тип 0x03 просто BsonBinarySubType.UUID_LEGACY, поэтому он используется в коде.

Что не так с этим типом поиска?Кто-нибудь может мне помочь с этим?Заранее спасибо.Использованный драйвер из репозитория mvn:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.9.1</version>
</dependency>
...