MongoDB 4.0 добавляет оператор агрегации $convert
и псевдоним $toString
, который позволяет выполнить именно это:
db.getCollection('example').aggregate([
{ "$match": { "example":1 } },
{ "$project": { "_id": { "$toString": "$_id" } } }
])
Основное использование, скорее всего, будет состоять в том, чтобы использовать значение _id
в качестве «ключа» в документе.
db.getCollection('example').insertOne({ "a": 1, "b": 2 })
db.getCollection('example').aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": [
[{
"k": { "$toString": "$_id" },
"v": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"cond": { "$ne": ["$$this.k", "_id"] }
}
}
}
}]
]
}
}}
])
Который возвращался:
{
"5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}
Который явно показывает строку, как и в другом примере.
Обычно, хотя обычно есть способ сделать «преобразование» в курсор, поскольку документы возвращаются с сервера. Обычно это хорошо, поскольку ObjectId
является 12-байтовым двоичным представлением, а не шестью «строками» из 24 символов, которые занимают намного больше места.
В оболочке есть метод .map()
db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
И у NodeJS есть Cursor.map()
, который может сделать то же самое:
let cursor = db.collection('example').find()
.map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
while ( await cursor.hasNext() ) {
let doc = cursor.next();
// do something
})
И тот же метод существует и в других драйверах (просто не PHP) , или вы можете просто перебирать курсор и преобразовывать содержимое, что, скорее всего, самое лучшее.
Как вы сказали «Любая помощь будет признательна» , я подумал, что хотел бы упомянуть, что вы можете просто конвертировать сырой файл YCbCr в PNG, TIFF, JPEG или любой другой файл формата с помощью ImageMagick [ 118], который устанавливается в большинстве дистрибутивов Linux и доступен для macOS и Windows.
Запустите терминал (или командную строку, если под Windows) и преобразуйте YCbCr image.raw
в PNG с помощью:
magick -size 1920x1080 -depth 8 YCbCr:image.raw result.png
Или, скажем, файла CCIR 601 YUV в формате NetPBM PPM
:
magick -size 800x600 -depth 8 YUV:image.raw result.ppm
Проигнорируйте этот бит и посмотрите ниже на РЕДАКТИРОВАТЬ:
Я не понимаю, почему вы используете
fread
? Почему бы не использоватьimread
, что означает не для чтения изображений? Используя это печально известное исходное изображение , в качестве основы для моего тестового сценария, я мог отобразитьYCbCr
изображение, как показано в небольшом сценарии ниже.blockquote>original = imread("lenna.jpg"); % figure, imshow(original); % if you want to see how the original image looks YCbCr_version = rgb2ycbcr(original); % figure, imshow(YCbCr_version); % if you want to see how the YCbCr image looks imwrite(YCbCr_version, "out.jpg"); YCbCr_fromFile = imread("out.jpg"); figure, imshow(YCbCr_fromFile);
РЕДАКТИРОВАТЬ:
- ЕСЛИ у вас есть бинарная версия файла, и вы можете только прочитать ее, используя
fread
, [1112 ], тогда должен работать следующий скрипт:
clc; clear; close all; original = imread("lenna.jpg"); % figure, imshow(original); % if you want to see how the original image looks YCbCr_version = rgb2ycbcr(original); % figure, imshow(YCbCr_version); % if you want to see how the YCbCr image looks fileID = fopen('out.bin','w'); fwrite(fileID, YCbCr_version, 'uint8'); fclose(fileID); fileID = fopen('out.bin','r'); fromFile = fread(fileID, 512*600*3, 'uint8=>uint8'); fclose(fileID); image = reshape(fromFile, 512, 600, 3); imagesc(image)
Дело в том, что в операции чтения вы должны также указать 3 канала в множителе, поскольку у цветных изображений этот третий размерность, т. е.
512*600*3
. Если вы дадите512*600
, как вы делали, у вас не будет информации о цвете. Также необходимо изменить функцию изменения формы, чтобы учесть 3-е измерение. Следовательно,reshape(fromFile, 512,600, 3)
.
- Версия YCbCr, загруженная из файла