用bson.binary做操作文件存到mongodb

博客介绍了Python文件读写时可能出错导致后续操作无法调用的问题。为保证无论是否出错都能正确关闭文件,可使用特定方式实现,同时提到Python引入语句来自动调用方法,使代码更简洁,无需手动调用相关方法。

 

import pymongo
import bson.binary
from cStringIO import StringIO

 

def lead_in_Mongodb(filename_lst, id_lst, url_lst):
    client = pymongo.MongoClient()
    db = client.Spyder
    collection = db['QuestMobile']
    fs = GridFS(db, collection="QuestMobile")
    for i in range(len(filename_lst)):
        with open(id_lst[i]+'.pdf', 'rb') as f:
            content = StringIO(f.read())
            collection.save(dict(
                content=bson.binary.Binary(content.getvalue()),
                filename=filename_lst[i],
                url_id = id_lst[i],
                url = url_lst[i]
            ))

with

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

with open('/path/to/file', 'r') as f:
    print(f.read())

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

<think>好的,我现在要解决Java中MongoDB类型不匹配的问题。用户提到的错误是“无法将类型从MongoCollection<org.bson.Document>转换为MongoCollection<com.sun.xml.internal.txw2.Document>”。我需要先理解这个错误的原因。 首先,用户可能在代码中使用了不同的Document类。MongoDB的Java驱动通常使用org.bson.Document来处理文档,而用户可能错误地导入了com.sun.xml.internal.txw2.Document,这是另一个同名的类,但属于不同的包,可能与XML处理相关。这两个类虽然都叫Document,但属于不同的库,所以类型不兼容。 接下来,我需要检查用户提供的代码引用。用户引用的代码中确实有导入com.mongodb.client.MongoCollection,而MongoCollection的泛型类型应该是org.bson.Document。如果用户在声明MongoCollection时错误地指定了泛型类型为com.sun.xml.internal.txw2.Document,就会导致类型不匹配的错误。 解决方案应该是确保所有相关的MongoDB操作都使用正确的Document类。用户需要检查代码中的导入语句,确保导入的是org.bson.Document,而不是其他包下的Document。此外,声明MongoCollection时应该明确使用MongoCollection<org.bson.Document>,避免泛型类型不匹配。 另外,可能需要检查MongoClient的连接配置,确保数据库和集合的获取方法正确返回了org.bson.Document类型的集合。例如,使用MongoDatabase.getCollection(String name)方法默认返回的是MongoCollection<org.bson.Document>,但如果用户尝试强制转换为其他类型,就会出错。 还可能存在依赖冲突,比如项目中引入了其他库,导致Document类被错误引用。需要检查项目的依赖,确保MongoDB驱动的版本正确,并且没有其他库引入同名的Document类。 最后,用户可能需要清理和重新构建项目,确保编译时使用的是正确的类路径和依赖。有时候IDE可能会缓存旧的类文件,导致问题持续存在。</think>要解决Java中MongoDB类型不匹配问题,需调整代码中不兼容的泛型类型声明。以下是具体解决方案: ### 1. 类型不匹配原因分析 错误提示表明尝试将`MongoCollection<org.bson.Document>`强制转换为`MongoCollection<com.sun.xml.internal.txw2.Document>`,这两个类的区别在于: - `org.bson.Document`:MongoDB驱动自带的BSON文档类型 - `com.sun.xml.internal.txw2.Document`:JDK内部XML处理类(不可直接使用) ### 2. 解决方案步骤 #### (1) 修正导入声明 ```java // 错误导入 import com.sun.xml.internal.txw2.Document; // 正确导入 import org.bson.Document; ``` #### (2) 统一泛型类型 ```java // 错误声明 MongoCollection<com.sun.xml.internal.txw2.Document> collection = database.getCollection("myCollection"); // 正确声明 MongoCollection<org.bson.Document> collection = database.getCollection("myCollection"); ``` #### (3) 完整代码示例 ```java try (MongoClient mongoClient = new MongoClient("localhost", 27017)) { MongoDatabase database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("users"); // 注意这里的泛型类型 // 查询示例 FindIterable<Document> result = collection.find(Filters.eq("age", 25)); } ``` ### 3. 验证要点 - 检查所有`Document`类引用是否来自`org.bson`包 - 确保MongoDB驱动版本与JDK兼容(推荐使用3.12+版本) - 使用Maven/Gradle清理本地仓库并重新编译项目 ### 4. 扩展知识 MongoDB Java驱动使用BSONBinary JSON)格式存储数据,`org.bson.Document`类提供: - `put()`/`get()`方法存取字段 - `toJson()`方法实现BSON-JSON转换 - 嵌套文档构建能力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值