用mongodb保存图片的两种方法

本文转载自https://blog.csdn.net/qq_23926575/article/details/79271436

godb提供的GridFS进行保存,两者各有利弊。性能方面的优劣未曾测试,无法进行评价,此处仅对两种方式进行介绍,若有彻知者还望指教。
下面以如下数据作为示例进行介绍:
数据示例

dic = {
    "owner_name" : "samssmilin",
    "photo_id" : "602880671",
    "tags" : "",
    "longitude" : "-121.106479",
    "height" : "766",
    "datetaken" : "2004-01-17 21:05:35",
    "width" : "1024",
    "length" : 38141,
    "photo_title" : "Dad and Elijah",
    "latitude" : "35.565222",
    "photo_url" : "https://farm2.staticflickr.com/1063/602880671_c2f4511ef4_b.jpg",
    "dateupload" : "1075355967",
    "owner_id" : "45365637@N00"
}123456789101112131415

一、GridFS

GridFS将图片数据与图片属性数据分开保存,用chunks来保存图片数据,files保存属性数据,一个图片file可能对应多个chunks,每个chunk的内存大小固定(16M),若图片数据大于chunk,则分为多个chunk保存,用同一个ObjectID关联,下载时自动将多个chunk合并为图片数据。
上传

from pymongo import MongoClient
from gridfs import *
import requests

client = MongoClient('127.0.0.1', 27017) #连接mongodb
db = client.photo #连接对应数据库
#db.authenticate("username","passowd")
fs = GridFS(db, collection="images") #连接collection
data = requests.get(dic["photo_url"], timeout=10).content
# 确认数据库中不存在此图片之后再保存
if not fs.find_one({"photo_url":dic["photo_url"]}):
    fs.put(data, **dic)
# 上传成功后,photo数据库下出现两个collection,分别为: images.files, images.chunks12345678910111213

下载

from pymongo import MongoClient
from gridfs import *
client = MongoClient('127.0.0.1', 27017) #连接mongodb
db = client.photo #连接对应数据库
#db.authenticate("username","passowd")
fs = GridFS(db, collection="images") #连接collection
num = 1
for grid_out in fs.find(no_cursor_timeout=True):
    data = grid_out.read() # 获取图片数据
    outf = open('/home/%d.jpg'%num,'wb')
    outf.write(data) #存储图片
    outf.close()
    if num%100000 == 0
        metadata_file = open("/home/metadata%d.csv"%(num/100000+1), "ab")
        csv_writer = csv.writer(metadata_file,delimiter='\t')
    row = [grid_out.photo_title.encode('utf-8'), grid_out.uploadDate, grid_out.upload_date, \
        grid_out.longitude, grid_out.latitude, grid_out.width, grid_out.height,\
        grid_out.owner_name.encode('utf-8'), grid_out.photo_id, grid_out._id, grid_out.photo_url]
    csv_writer.writerow(row)12345678910111213141516171819

bson二进制

这种方法将图片数据作为键值对放入字典与属性数据作为整体存入数据库中。
上传代码如下:

from bson import binary
from pymongo import MongoClient

client = MongoClient('127.0.0.1', 27017) #连接mongodb
db = client.photo #连接对应数据库
image_collection = db.images
data = requests.get(dic["photo_url"], timeout=10).content
# 确认数据库中不存在此图片之后再保存
if not image_collection.find_one({"photo_url":dic["photo_url"]})
    dic["imagecontent"] = binary.Binary(data)
    image_collection.insert(dic)1234567891011
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB是一个开源的NoSQL数据库,可以用于保存和管理数据。要在MongoDB保存数据,可以按照以下步骤进行操作: 1. 安装MongoDB:首先,你需要在你的机器上安装MongoDB。你可以从官方网站下载并按照说明进行安装。 2. 启动MongoDB服务:安装完成后,启动MongoDB服务。具体的步骤可以根据你的操作系统和安装方式不同而有所差异。一般来说,你可以通过命令行或者可视化工具来启动MongoDB服务。 3. 连接到数据库:一旦MongoDB服务启动,你可以使用MongoDB提供的客户端工具(如mongo shell)或者编程语言的驱动程序来连接到数据库。在连接数据库时,你需要指定数据库的地址、端口号和认证信息等。 4. 创建数据库和集合:在连接到数据库后,你可以创建新的数据库和集合(类似于关系型数据库中的表)。MongoDB是一种面向文档的数据库,数据存储在文档中,集合是文档的容器。 5. 插入数据:一旦你创建了集合,你可以使用插入操作将数据保存到集合中。插入操作可以使用命令行工具或者编程语言驱动程序提供的API进行。 例如,使用Node.js驱动程序进行插入数据的示例代码如下: ```javascript const MongoClient = require('mongodb').MongoClient; // 连接到MongoDB数据库 const uri = 'mongodb://localhost:27017/mydatabase'; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); client.connect(err => { if (err) throw err; // 选择数据库和集合 const db = client.db('mydatabase'); const collection = db.collection('mycollection'); // 插入数据 const data = { name: 'John', age: 30 }; collection.insertOne(data, (err, result) => { if (err) throw err; console.log('数据插入成功'); client.close(); }); }); ``` 这是一个简单的示例代码,它连接到名为'mydatabase'的数据库并在名为'mycollection'的集合中插入一条数据。你可以根据需要自定义数据结构和插入逻辑。 以上是保存数据到MongoDB的基本步骤,具体的操作可能会因为你使用的工具和编程语言而有所不同。你可以参考MongoDB的官方文档和相应的驱动程序文档以获取更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值