Перейти к содержимому

Как хранить картинки в mongodb

  • автор:

хранение файлов в mongodb

Есть база mongodb.В коллекции хранятся текстовые данные и файлы(картинки около 1мб).

Упадет ли скорость поиска по текстовым данным из-за файлов?

Нормальная ли тема хранить файлы в mongodb(может хотябы отдельную коллекцию создать)?

sanets ★
26.05.14 17:53:24 MSK

1) Нет, не упадет, если индексы нормальные. 2) Нет, не нормальная. Если уж очень нужно хранить картинки в базе, то да, только в отдельных коллекциях. Иначе забудешь где-нибудь projection сделать и они туда-сюда будут гоняться.

slyjoeh ★★★
( 26.05.14 23:22:43 MSK )

файлы надо хранить на файловой системе

Как мне отправить картинку в базу данных MongoDB?

Мне нужно отправить картинку в базу данных, чтобы потом можно было по запросу ее оттуда получить и отобразить на странице. У меня вопрос в реализации. Кааак? Я поизучал этот вопрос, но там и не смог ничего сделать Можно просто закодировать в base64. (типо ты просто кодируешь и отправляешь это в виде строки я так понимаю, а получаешь и Декодируешь обратно в картинку, это так работает? Если да, то как это сделать?) Пишу на NodeJS express, база данных MongoDB

Отслеживать
задан 4 апр 2021 в 20:01
максим фефилов максим фефилов
1 2 2 бронзовых знака
23 ноя 2021 в 7:26
Я думаю в твоем случая самое простое будет заюзать либу node-base64-image — npm
16 фев 2022 в 18:52

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Хранишь картинку на сервере — в базе путь до неё.

Отслеживать
ответ дан 4 апр 2021 в 20:03
Senbonzakuraa Senbonzakuraa
620 3 3 серебряных знака 18 18 бронзовых знаков
Я не очень понимаю, всмысле на сервере?
4 апр 2021 в 20:05
Как можно ханить картинку на сервере?
4 апр 2021 в 20:05
а где по твоему хранится изображение? на сервере.
4 апр 2021 в 20:05

Гугли «загрузка изборажений на сервер Node.js». Твои пикчи будут лежать где-нить в корне проекта, какая-нить папка uploads, например.

4 апр 2021 в 20:07

При всём уважении к ответу и комментариям, это всё таки ответ не на тот вопрос,котрый был задан. В некотрых случаях хренение картинок в базе предпочтительнее храннеия в файловой системе. С другой стороны, я уверен, что такой код гуглится без особых проблем.

4 апр 2021 в 21:33

Я написал методы с base64, конвертацией в буфер и обратно, записью и чтением из MDB может чем-то тебе поможет.

UPD: url для подключения к mdb изменился.

const mongoClient = require("mongodb").MongoClient; const fs = require('fs'); //const url = 'mongodb://username:[email protected]:12345/terba';// deprecated const url = 'mongodb+srv://:@basName.7jsay.mongodb.net/?retryWrites=true&w=majority'; function mdbConnect(operation, data)< mongoClient.connect(url,< useNewUrlParser: true, useUnifiedTopology: true>, function(err, client)< const db = client.db("terba");//Твоё наименование const collection = db.collection("user");//Твоё наименование if (operation === "update"),//команда для вставки значения data в поле photo в документ с _id:"myPhoto" ,//создаст документ с _id:"myPhoto" полем photo и значением data если такого нет в БД function(err, res)else < console.log(res.result.nModified, res.result.upserted)//На что тебе надо обратить внимание >> ); > if (operation === "find")< console.log(photo)//Здесь твоя фотка в виде Buffer`a let string64 = buffer.toString('base64');//можешь конвертировать в base64 если надо >) > client.close(); >); > function fsr() < let path = "C:\\express\\myProject\\img\\0.jpg" //Это путь к картинке на диске let data = fs.readFileSync(path).toString('base64');//читаешь картинку при помощи fs и конвертишь в base64 let buf = Buffer.from(data, 'base64');//конвертируешь обратно в buffer // console.log(data,buf) mdbConnect("update", buf)//пишешь в mdb буфер, можешь base64 попробовать он в data лежит >mdbConnect("find", "myPhoto")//читаешь из mdb function fsw(data)< fs.writeFileSync("C:\\express\\myProject\\img\\0.jpg", data, 'base64',(err)=>); > let htmlTag = ' '/*создаёшь строку тега img с атрибутом src пишешь туда картинку в base64 отправляешь её клиенту*/ //На клиенте что-то из этого // document.getElementById('as').innerHTML="";//Вставляешь на клиенте в контейнер с id "as" например, или куда тебе надо // function createImg (base64) < //Или в тело документа // var image = new Image(); // image.src = "data:image/jpg;base64,"+base64; // document.body.appendChild(image); //>

Работа с базой данных

Всю модель устройства базы данных в MongoDB можно представить следующим образом:

Организация базы данных в MongoDB

Если в реляционных бд содержимое составляют таблицы, то в mongodb база данных состоит из коллекций .

Каждая коллекция имеет свое уникальное имя — произвольный идентификатор, состоящий из не более чем 128 различных алфавитно-цифровых символов и знака подчеркивания.

В отличие от реляционных баз данных MongoDB не использует табличное устройство с четко заданным количеством столбцов и типов данных. MongoDB является документо-ориентированной системой, в которой центральным понятием является документ .

Документ можно представить как объект, хранящий некоторую информацию. В некотором смысле он подобен строкам в реляционных субд, где строки хранят информацию об отдельном элементе. Например, типичный документ:

Документ представляет набор пар ключ-значение. Например, в выражении «name»: «Tom» «name» представляет ключ, а «Tom» — значение.

Ключи представляют строки. Значения же могут различаться по типу данных. В данном случае у нас почти все значения также представляют строковый тип, и лишь один ключ (company) ссылается на отдельный объект. Всего имеется следующие типы значений:

  • String : строковый тип данных, (для строк используется кодировка UTF-8)
  • Array (массив) : тип данных для хранения массивов элементов
  • Binary data (двоичные данные) : тип для хранения данных в бинарном формате
  • Boolean : булевый тип данных, хранящий логические значения TRUE или FALSE , например,
  • Date : хранит дату в формате времени Unix
  • Double : числовой тип данных для хранения чисел с плавающей точкой
  • Integer : используется для хранения целочисленных значений размером 32 бита, например,
  • Long : используется для хранения целочисленных значений размером 64 бита
  • JavaScript : тип данных для хранения кода javascript
  • Min key/Max key : используются для сравнения значений с наименьшим/наибольшим элементов BSON
  • Null : тип данных для хранения значения Null
  • Object : объект, который содержит набор свойств
  • ObjectId : тип данных для хранения id документа
  • Regular expression : применяется для хранения регулярных выражений
  • Decimal128 : тип данных для хранения десятичных дробных чисел размером 128 бит, которые позволяют решить проблемы с проблемой точности вычислений при использовании дробных чисел, которые представляют тип Double.
  • Timestamp : применяется для хранения времени

В отличие от строк документы могут содержать разнородную информацию. Так, рядом с документом, описанным выше, в одной коллекции может находиться другой объект, например:

Казалось бы разные объекты за исключением отдельных свойств, но все они могут находиться в одной коллекции.

Еще пара важных замечаний: в MongoDB запросы обладают регистрозависимостью и строгой типизацией. То есть следующие два документа не будут идентичны:

Если в первом случае для ключа age определена в качестве значения строка, то во втором случае значением является число.

Идентификатор документа

Для каждого документа в MongoDB определен уникальный идентификатор, который называется _id . При добавлении документа в коллекцию данный идентификатор создается автоматически. Однако разработчик может сам явным образом задать идентификатор, а не полагаться на автоматически генерируемые, указав соответствующий ключ и его значение в документе.

Данное поле должно иметь уникальное значение в рамках коллекции. И если мы попробуем добавить в коллекцию два документа с одинаковым идентификатором, то добавится только один из них, а при добавлении второго мы получим ошибку.

Если идентификатор не задан явно, то MongoDB создает специальное бинарное значение размером 12 байт. Это значение состоит из нескольких сегментов: значение типа timestamp размером 4 байта (которое представляет количество секунд с момента начала эпохи Unix), случайное число из 5 байт и счетчик из 3 байт, который инициализирован случайным числом. Такая модель построения идентификатора гарантирует с высокой долей вероятности, что он будет иметь уникальное значение.

Как сохранить фото в MongoDB?

Всем привет!) Нужно с клиента(формы и инпута типа file) принять изображение на сервере, записать его в базу данных (mongo) и потом в случае чего вывести. Это изображение должно быть записано в поле «image» схемы User. Собственно, как это реализовать адекватно ? Или в любом случае нужно делать отдельную коллекцию под изображения?

  • Вопрос задан более трёх лет назад
  • 8027 просмотров

2 комментария

Оценить 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *