2

我有一个这样的 MongoDB 集合,其中包含游戏玩家的详细信息:

{
    ...
    "fields" : {
            "playername" : "Koala",
            ...
    }
    ...
}

我想在一个数组中获取玩家的 ID。因此,例如,我这样做:

// players: ["Koala", "Cactus"]
Criteria base = Criteria.where("fields.playername").in(players);
DBObject match = base.getCriteriaObject();
List<?> userDetailIds = playersCollection.distinct("_id", match);

太好了,我有一个对象列表 ( com.mongodb.BasicDBList) ( )。但现在我想在新查询中使用该列表,例如,获取这些玩家的所有徽章。徽章收藏:ObjectIdorg.bson.types.ObjectId$in

{
        "badgeName": "MongoDB Killer", 
        "userDetailID" : "525c4be1975ac2a8f4a64c6f"
        ...
}

在 Java 中:

mongo.find(Query.query(Criteria.where("userDetailID").in(userDetailIds)), Badges.class);

这不起作用,因为userDetailIds包含ObjectId对象并且userDetailID是一个String字段。如何使用 BasicDBList 作为$in参数?或者:我可以得到一个StringID 数组而不是ObjectIds 吗?

谢谢!

PD。我不想遍历列表以将其转换为List<String>.

4

1 回答 1

0

使用toHexString()ObjectId实例转换为 24 字节十六进制字符串表示的方法:

List<ObjectId> objIds = playersCollection.distinct("_id", match);
List<String> userDetailIds = new ArrayList<String>();
for (ObjectId objId : objIds) {
    userDetailIds.add(objId != null ? objId.toHexString() : null);
}

mongo.find(Query.query(Criteria.where("userDetailID").in(userDetailIds)), Badges.class);
于 2015-11-06T10:50:29.133 回答