MongoDB C# Как обновить файл и метаданные GridFS?

Нужно решение, чтобы увидеть, существует ли файл сетки, а затем обновить файл метаданными.

Я использую решение ниже. но хочется лучше.

Не возражайте против отдельных методов Update и Delete.

Спасибо

Public Class storedXYZ 

    Property Data As Stream

    Property MetaData As storedXYZMetaData

End Class

Public Sub SaveStoredXYZ(storedXYZ As StoredXYZ) 


        Dim MongoGridFSCreateOptions As New MongoDB.Driver.GridFS.MongoGridFSCreateOptions

        Dim qry As IMongoQuery


        qry = Query.EQ("metadata.StoredXYZId", BsonValue.Create(storedXYZ.MetaData.StoredXYZ.ToString()))


        Dim gridFile As MongoGridFSFileInfo = mdbGridFS.FindOne(qry)


        If gridFile IsNot Nothing Then

            Dim mongoStream As MongoGridFSStream

            MongoGridFSCreateOptions.Metadata = storedXYZ.MetaData.ToBsonDocument

            mongoStream = gridFile.OpenWrite()

            ''Convert MongoStream to MemoryStream
            Dim fs As Stream = New MemoryStream()
            Dim buffer As Byte() = New Byte(9999) {}
            Dim bytesRead As Integer = 0
            Do
                bytesRead = storedXYZ.Data.Read(buffer, 0, buffer.Length)
                mongoStream.Write(buffer, 0, bytesRead)
            Loop While bytesRead > 0

            mongoStream.Seek(0, SeekOrigin.Begin)
            mongoStream.Position = 0


            mdbGridFS.SetMetadata(gridFile, storedAXYZ.MetaData.ToBsonDocument)

        Else

            MongoGridFSCreateOptions.Metadata = storedXYZ.MetaData.ToBsonDocument

            Dim fileinfo As MongoGridFSFileInfo

            fileinfo = mdbGridFS.Upload(storedXYZ.Data, storedXYZ.MetaData.Name, MongoGridFSCreateOptions)

        End If

End Sub

person Amit Pore    schedule 11.04.2014    source источник


Ответы (3)


Вместо того, чтобы пытаться перезаписать текущий файл, почему бы просто не запустить команду удаления, а затем повторно загрузить файл и обновить документ до старых идентификаторов?

person pingoo    schedule 11.04.2014
comment
Спасибо за ваш ответ. Проблема в том, что во время обновления существующего файла он находится в несогласованном состоянии (значения длины и md5 в метаданных fs.files недействительны, пока вы снова не закроете файл, не говоря уже о том, что данные меняются) . Это означает, что другие процессы могли видеть промежуточную и несогласованную версию файла, а обновление давало сбой по какой-то причине, так как файл GridFS был безвозвратно поврежден. С другой стороны, обновление существующего файла на месте может дать огромный прирост производительности, когда изменяется всего несколько байтов. - person Amit Pore; 11.04.2014
comment
Приведенное выше решение работает, но хотелось лучшего. Я думал удалить и загрузить снова. но представьте, что это массовая вставка файлов. Перед сохранением он должен проверить, существует ли файл. - person Amit Pore; 11.04.2014

Метод загрузки MongoGridFS получает новую версию файла, когда вы загружаете файл, используя существующее имя файла.

Использование OpenWrite с существующим именем файла обновляет файл на месте. Драйвер C# — это единственный драйвер, который позволяет обновлять файл GridFS на месте.

Дополнительная информация здесь

person Amit Pore    schedule 11.04.2014

Вы можете использовать коллекции fs.files и fs.chnuks как любую другую коллекцию, но вы должны соблюдать осторожность, чтобы сохранить важные для GridFS данные нетронутыми.

person Sebastian Xawery Wiśniowiecki    schedule 18.09.2015