2 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
您沒有試圖理解的邏輯。在新的官方 mongo 驅(qū)動(dòng)程序中找不到太多關(guān)于 contentType 的原因是因?yàn)樵诰帉戲?qū)動(dòng)程序之前很久,contentType 在 gridfs 規(guī)范中就已被棄用。
我必須承認(rèn)gridfs 文檔沒有提到它。事實(shí)上,官方的 mongofiles cli 仍然使用傳統(tǒng)格式。
規(guī)范直截了當(dāng):
注意:一些舊版本的 GridFS 實(shí)現(xiàn)允許應(yīng)用程序在根級(jí)別向文件集合文檔添加任意字段。GridFS 的新實(shí)現(xiàn)將不允許這樣做,但必須準(zhǔn)備好處理可能具有附加字段的現(xiàn)有文件集合文檔。
如果你喜歡更詳細(xì)的官方推理:
為什么不推薦使用 contentType?
文件集合文檔中的大多數(shù)字段都由驅(qū)動(dòng)程序直接使用,但元數(shù)據(jù)、內(nèi)容類型和別名除外。所有純粹供應(yīng)用程序使用的信息都應(yīng)嵌入“元數(shù)據(jù)”文檔中。鼓勵(lì)希望存儲(chǔ) contentType 以在其應(yīng)用程序中使用的 GridFS 用戶將“contentType”字段添加到“元數(shù)據(jù)”文檔,而不是使用已棄用的頂級(jí)“contentType”字段。
這有點(diǎn)道理。contentType
驅(qū)動(dòng)程序從字面上遵循規(guī)范的措辭——除了在 中,無法在任何地方創(chuàng)建屬性metadata
,但 Bucket.Find 仍將返回contentType
由“舊版本”創(chuàng)建的文件。
從遺留 gridfs 到新格式的一次性轉(zhuǎn)換可以很簡(jiǎn)單:
db.getCollection("fs.files").aggregate([
? ? {$addFields: {?
? ? ? ? "length" : {$toLong: "$length"},
? ? ? ? "metadata.contentType": { $ifNull: [ "$contentType", "$metadata.contentType" ] }?
? ? }},
? ? { $out : "fs.files" }
])
假設(shè)您的存儲(chǔ)桶默認(rèn)為“fs”并且您不會(huì)以舊格式上傳文件。如果您有足夠的可用空間,那么創(chuàng)建新的臨時(shí)集合、驗(yàn)證它然后重命名并不是一個(gè)糟糕的主意out。
如果出于任何原因必須支持舊版格式,您仍然可以直接訪問 gridfs 集合:
// in your code snippet after
fileID = uploadStream.FileID
// update the document that represent uploaded file
files := db.Collection("fs.files")
updateResult, err := files.UpdateOne(
? ? context.Background(),
? ? bson.D{{"_id", fileID}},
? ? bson.D{{"$set", bson.D{{"contentType", contentType}}}},
)
其中“fs”是您的存儲(chǔ)桶名稱,contentType是您要設(shè)置為 contentType 的字符串值。
請(qǐng)記住,“一些舊版本”使用 int32 作為文件長(zhǎng)度。新驅(qū)動(dòng)程序期望它是 int64。對(duì)于單獨(dú)使用 *.fiiles 集合的類似查找的操作應(yīng)該沒問題,但可能會(huì)導(dǎo)致使用新的官方驅(qū)動(dòng)程序下載此類文件時(shí)出現(xiàn)問題。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊
這是一個(gè)例子SetMetadata()。
opts := options.GridFSUpload()
opts.SetMetadata(bsonx.Doc{{Key: "content-type", Value: bsonx.String("application/json")}})
if ustream, err = bucket.OpenUploadStream("test.txt", opts); err != nil {
? ? t.Fatal(err)
}
- 2 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報(bào)