2017-09-23 29 views
0

我已经将Set<String>保存为mongodb作为数组,然后我想再次将它加载到Set<String>。这个怎么做?如何转换Mongo Document至java Set <String>?

我尝试回报例外:

package Database; 

import static com.mongodb.client.model.Filters.eq; 
import static com.mongodb.client.model.Projections.fields; 
import static com.mongodb.client.model.Projections.include; 

import java.util.HashSet; 
import java.util.Set; 

import org.bson.Document; 

import com.mongodb.MongoClient; 
import com.mongodb.MongoClientURI; 
import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 

public class StackOverflow { 

    public static void main(String[] args) { 

     // insert something to mongo: 
     final String URI = "mongodb://localhost:27017"; 
     final String DB = "StackOverflowQuestion"; 
     final String COLLECTION = "eqDoesntExcist"; 

     MongoClientURI connection = new MongoClientURI(URI); 
     MongoClient mongo = new MongoClient(connection); 
     MongoDatabase database = mongo.getDatabase(DB); 
     MongoCollection<Document> collection = database.getCollection(COLLECTION); 

     Set<String> namesOfTroysKids = new HashSet<>(); 
     namesOfTroysKids.add("Paul"); 
     namesOfTroysKids.add("Jane"); 
     namesOfTroysKids.add("Mark"); 
     namesOfTroysKids.add("Ivona"); 

     Document doc = new Document("name", "Troy").append("height", 185).append("kids", namesOfTroysKids); 
     collection.insertOne(doc); 

     // read something from mongo 
     FindIterable<Document> findIt = collection.find(eq("name", "Troy")).projection(fields(include("kids"))); 
     Document d = findIt.first(); 

     Set<String> kids = (Set<String>) d; // ERROR !!! 
     ///Exception in thread "main" java.lang.ClassCastException: org.bson.Document cannot be cast to java.util.Set 
     //at Database.StackOverflow.main(StackOverflow.java:45) 

    } 

} 

有方法toArray()但它是DBOBJECT进行折旧。

回答

1

您的查询返回的文档是:

{ 
    "_id": { 
     "$oid": "_id_value_" 
    }, 
    "kids": [ 
     "Mark", 
     "Ivona", 
     "Paul", 
     "Jane" 
    ] 
} 

这显然不能隐式强制为一组。它现在距离它从文件的列表获取孩子和实例化一组物质:

public static void main(String [] args) throws Exception { 
    final String URI = "mongodb://localhost:27017";    
    final String DB = "StackOverflowQuestion"; 
    final String COLLECTION = "eqDoesntExcist"; 

    MongoClientURI connection = new MongoClientURI(URI); 
    MongoClient mongo = new MongoClient(connection); 
    MongoDatabase database = mongo.getDatabase(DB); 
    MongoCollection<Document> collection = database.getCollection(COLLECTION); 

    Set<String> namesOfTroysKids = new HashSet<>(); 
    namesOfTroysKids.add("Paul"); 
    namesOfTroysKids.add("Jane"); 
    namesOfTroysKids.add("Mark"); 
    namesOfTroysKids.add("Ivona"); 

    Document doc = new Document("name", "Troy").append("height", 185).append("kids", namesOfTroysKids); 
    collection.insertOne(doc); 

    // read something from mongo 
    FindIterable<Document> findIt = collection.find(Filters.eq("name", "Troy")).projection(Projections.include("kids")); 
    Document d = findIt.first(); 

    System.out.println("doc: " + d.toJson()); 

    List<String> kidsList = (List<String>) d.get("kids", List.class); 

    Set<String> kidsSet = new HashSet<>(kidsList); 

    System.out.println("kids: " + kidsSet); 
} 
1

基本上是一个可迭代类型是什么,通过意味着回路。如果你使用了Iterable类型的唯一方法将其分配到一个Java数据类型打开游标是抓住一个迭代。您已通过使用会抓住你的查询返回的第一个文件的第一个方法做到了这一点,请注意,如果这是你的意图,你可以使用排序来控制返回哪些文件。

以下是代码。当我这样做,我一般做任何我需要与数据一个接一个,除非我需要整个数据集之前,我开始我的处理。

Set<String> kids = new Set<String>;  
for(Document kidDoc : collection.find(eq("name", "Troy"))){ 
     kids.add(kidDoc.getString("kids"))) 
} 
相关问题