【问题标题】:Java MongoDB how to use BasicDBList as $in parameterJava MongoDB 如何使用 BasicDBList 作为 $in 参数
【发布时间】:2015-11-06 10:28:39
【问题描述】:

我有一个这样的 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);

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

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

在 Java 中:

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

这不起作用,因为userDetailIds 包含ObjectId 对象,而userDetailIDString 字段。 如何将 BasicDBList 用作 $in 参数? 或者: 我可以获取String ID 数组而不是ObjectIds 吗?

谢谢!

PD。我不想遍历列表以将其转换为 List&lt;String&gt;

【问题讨论】:

    标签: java mongodb mongo-java mongo-java-driver


    【解决方案1】:

    使用 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);
    

    【讨论】:

    • 您好,谢谢!但我正在寻找一种不需要遍历objIds 的解决方案。我可以得到List&lt;String&gt; 而不是List&lt;ObjectId&gt; 吗?有没有办法在第二个查询中直接使用objIds
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2018-05-22
    • 1970-01-01
    • 2014-08-08
    相关资源
    最近更新 更多