хранение файлов в 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")/ Запрос для обновления твоей фотки в БД collection.updateOne( , //id документа коллекции "user" в который будет вставляться картинка >,//команда для вставки значения data в поле photo в документ с _id:"myPhoto" ,//создаст документ с _id:"myPhoto" полем photo и значением data если такого нет в БД function(err, res)/функция по окончанию выполнения операции if (err) < console.log(err) >else < console.log(res.result.nModified, res.result.upserted)//На что тебе надо обратить внимание >> ); > if (operation === "find")/ Запрос для поиска твоей фотки в БД по значению в поле _id collection.find( ).forEach( photo =>< 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)=>/читаешь строку data в base64 и пишешь на диск кртинку .jpg console.log(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 база данных состоит из коллекций .
Каждая коллекция имеет свое уникальное имя — произвольный идентификатор, состоящий из не более чем 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 комментария