Как обновить данные чанка MongoDB GridFS в Go?

Привет, сообщество Stack Overflow! Я столкнулся с проблемой обновления полей данных файлов, хранящихся в моей MongoDB, с помощью GridFS. Я не совсем уверен, как к этому подойти, и мне могли бы пригодиться некоторые рекомендации.

Вот настройка:

Моя основная база данных называется node-craft. Он содержит три коллекции: node, Node-FileStorage.files и Node-FileStorage.chunks. Ниже приведены примеры объектов из каждой из этих коллекций для справки: узел

  1. узел
      {
  "_id": {
    "$oid": "6526a1497d7b83889296939e"
  },
  "id": "2705973598",
  "name": "man_secretpassword.txt",
  "type": 1,
  "parentId": "2705952637",
  "directory": "/PROJECT/man_secretpassword.txt",
  "files": {
    "$oid": "6526a1497d7b83889296939c"
  }
}
  1. Node-FileStorage.files
      {
  "_id": {
    "$oid": "6526a1497d7b83889296939c"
  },
  "length": {
    "$numberLong": "27"
  },
  "chunkSize": 261120,
  "uploadDate": {
    "$date": "2023-10-11T13:21:13.309Z"
  },
  "filename": "man_secretpassword.txt"
}
  1. 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
}

0 ответов

Другие вопросы по тегам