2015-11-06 65 views
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); 

太好了,我有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參數? OR: 我可以得到一組String ID而不是ObjectId s嗎?

謝謝!

PD。我不想遍歷列表將其轉換爲List<String>

回答

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); 
+0

您好,感謝!但是我正在尋找一種不需要遍歷'objIds'的解決方案。我能否獲得'列表'而不是'列表'?有沒有辦法直接在第二個查詢中使用'objIds'? – Roi

相關問題