В моей тестовой базе данных есть следующая коллекция (на самом деле есть только один документ):
> 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>