如何使用Java Mongo DB驱动程序版本3将BasicDBObject转换为Mongo文档?

时间:2015-08-12 14:42:21

标签: java mongodb

在Java Mongo数据库驱动程序版本3中,API与版本2相比已经发生了变化。因此像这样的代码不再编译:

BasicDBObject personObj = new BasicDBObject();
collection.insert(personObj) 

集合插件仅适用于Mongo文档。

处理旧代码我需要提出问题:

将BasicDBObject转换为Document的最佳方法是什么?

4 个答案:

答案 0 :(得分:7)

我认为最简单的方法就是更改代码以使用Document而不是BasicDBObject。

所以改变

BasicDBObject doc = new BasicDBObject("name", "john")
    .append("age", 35)
    .append("kids", kids)
    .append("info", new BasicDBObject("email", "john@mail.com")
    .append("phone", "876-134-667"));

import org.bson.Document;
...
Document doc = new Document("name", "john")
    .append("age", 35)
    .append("kids", kids)
    .append("info", new BasicDBObject("email", "john@mail.com")
    .append("phone", "876-134-667"));

然后插入集合

coll.insertOne(doc);

您需要更改其他代码才能使用MongoDB 3 +

MongoDatabase与DB MongoCollection与DBCollection

答案 1 :(得分:6)

我们可以转换 BasicDBObject 通过以下方式 Document

public static Document getDocument(DBObject doc)
{
   if(doc == null) return null;
   return new Document(doc.toMap());
}

Document 本身是 Map<String,Object> 的实现。

由于BasicDBObject DBObject是[{1}}的实现,因此BasicDBObject中的

DBObject也可能被捕获。

@ Black_Rider也是

答案 2 :(得分:2)

Document与BasicDBObject非常相似。我不太确定你所指的是将BasicDBObjects转换为Documents的方法,但是Document对象提供了一些非常有用的方法。

如果您使用JSON字符串提供文档,则Document.parse(string)将返回Document。

Document.append(&#34; key&#34;,Value)将添加到Document的字段中。

至于你帖子中的代码,这应该用版本3编译:

Document personObj = new Document();
collection.insertOne(personObj) 

Java Driver 3.0 Guide

MongoDB Java Driver 3.0 Documentation

答案 3 :(得分:1)

@SuppressWarnings("unchecked")
public static Document getDocument(BasicDBObject doc)
{
    if(doc == null) return null;
    Map<String, Object> originalMap = doc.toMap();
    Map<String, Object> resultMap = new HashMap<>(doc.size());  
    for(Entry<String, Object> entry : originalMap.entrySet())
    {
        String key = entry.getKey();
        Object value = entry.getValue();
        if(value == null)
        {
            continue;
        }
        if(value instanceof BasicDBObject)
        {
            value = getDocument((BasicDBObject)value);
        }
        if(value instanceof List<?>)
        {
            List<?> list = (List<?>) value;
            if(list.size() > 0)
            {
                // check instance of first element
                Object firstElement = list.get(0);
                if(firstElement instanceof BasicDBObject)
                {
                    List<Document> resultList = new ArrayList<>(list.size());
                    for(Object listElement : list)
                    {
                        resultList.add(getDocument((BasicDBObject)listElement));
                    }
                    value = resultList;
                }
                else
                {
                    value = list;
                }
            }
        }
        resultMap.put(key, value);
    }
    Document result = new Document(resultMap);
    return result;
}