Как обновить данные чанка MongoDB GridFS в Go?
Привет, сообщество Stack Overflow! Я столкнулся с проблемой обновления полей данных файлов, хранящихся в моей MongoDB, с помощью GridFS. Я не совсем уверен, как к этому подойти, и мне могли бы пригодиться некоторые рекомендации.
Вот настройка:
Моя основная база данных называется node-craft. Он содержит три коллекции: node, Node-FileStorage.files и Node-FileStorage.chunks. Ниже приведены примеры объектов из каждой из этих коллекций для справки: узел
- узел
{
"_id": {
"$oid": "6526a1497d7b83889296939e"
},
"id": "2705973598",
"name": "man_secretpassword.txt",
"type": 1,
"parentId": "2705952637",
"directory": "/PROJECT/man_secretpassword.txt",
"files": {
"$oid": "6526a1497d7b83889296939c"
}
}
- Node-FileStorage.files
{
"_id": {
"$oid": "6526a1497d7b83889296939c"
},
"length": {
"$numberLong": "27"
},
"chunkSize": 261120,
"uploadDate": {
"$date": "2023-10-11T13:21:13.309Z"
},
"filename": "man_secretpassword.txt"
}
- Node-FileStorage.chunks
{
"_id": {
"$oid": "6526a1497d7b83889296939d"
},
"files_id": {
"$oid": "6526a1497d7b83889296939c"
},
"n": 0,
"data": {
"$binary": {
"base64": "bWFuQGdtYWlsLmNvbSAxMjM0IDAzMDkzMg0K",
"subType": "00"
}
}
}
**Я пробовал разные подходы, но ни один из них не сработал. У меня есть строка с newContent, а также files_id (как показано в коллекции фрагментов). Моя цель — обновить данные чанка, соответствующего этому files_id, а затем вернуть обновленные данные.
Вот моя текущая функция обновления, но она не работает должным образом:**
Итак, я попробовал все, но ничего не работает. У меня есть строка с newContent и files_id (если вы посмотрите на коллекцию фрагментов). Я хочу обновить данные фрагмента, имеющего files_id, а затем вернуться. Кто-нибудь может мне помочь?
Моя текущая функция обновления (она ничего не делает):
func UpdateGridFSChunk(chunkID string, newContent string) error {
// Convert the new content string to bytes.
newData := []byte(newContent)
// Find the chunk by its ID.
chunkObjID, err := primitive.ObjectIDFromHex(chunkID)
if err != nil {
return err
}
filter := bson.M{"_id": chunkObjID}
chunkFileCursor, err := fs.Find(filter)
if err != nil {
return err
}
if chunkFileCursor.Next(context.Background()) {
// Get the GridFS file properties.
chunkFile := chunkFileCursor.File()
// Create a new ObjectID for the updated chunk.
newChunkObjID := primitive.NewObjectID()
// Replace the chunk's data with the new data.
err = fs.UploadFromStreamWithID(newChunkObjID, chunkFile.Filename, bytes.NewReader(newData))
if err != nil {
return err
}
err = fs.Delete(chunkObjID)
if err != nil {
return err
}
}
return nil
}