【发布时间】:2018-06-20 04:56:01
【问题描述】:
我正在尝试在 MongoDB 中查询一个文档的 _id,然后在查询中使用该 _id 来查询在其一个字段中具有该 id 的另一个文档。
我无法将 id 转换为 MongoCollection.find 方法允许的格式。
现在,第一个查询中返回的 _id 如下所示:
Document{{_id=4be67619-9a9b-f550-be1b-6086e7038c86,...}}
在我的代码中,我正在这样做:
Document mongoDoc = null;
UUID customerId = null;
BasicDBObject mongoQuery = new BasicDBObject();
第一个查询获取 _id 并在光标对象中将 _id 捕获到 UUID 对象,如下所示:
while(cur.hasNext()) {
mongoDoc = cur.next();
customerId = (UUID) mongoDoc.get("_id");
}
第二个查询如下所示:
mongoQuery.put("CustomerId", new ObjectId(customerId.toString()));
但是当我运行查询时,我得到:
java.lang.IllegalArgumentException: invalid hexadecimal representation of an ObjectId: [4be67619-9a9b-f550-be1b-6086e7038c86]
at org.bson.types.ObjectId.parseHexString(ObjectId.java:550)
at org.bson.types.ObjectId.<init>(ObjectId.java:240)
at ngm.java.automation.MongoDbMethodsUnitTest.main(MongoDbMethodsUnitTest.java:61)
一个工作的 mongo shell 查询看起来像这样(我通过右键单击第一个查询中的 _id 值并选择复制文档来获得这个值):
db.Customer.find({
"CustomerId" : BinData(3, "UPWbmhl25kuGjAPnhmAbvg==")
});
Studio 3T 说 Java 版本应该是这样的:
query.append("CustomerId", new Binary((byte) 3, new byte[] { 80, -11, -101, -102, 25, 118, -26, 75, -122, -116, 3, -25, -122, 96, 27, -66 }));
但我不确定如何将 UUID 转换为二进制 3,也不确定这是否真的是正确的做法。
在 Java 中执行此操作的正确方法是什么?
【问题讨论】:
-
类似
customerId = new Binary((byte) 3, mongoDoc.get("_id").getBytes()); -
事实证明 MongoCollection.find 方法将允许 UUID 对象并且工作得很好。我忘记将 Collection 变量更改为指向实际包含我感兴趣的数据的 Collection。