【问题标题】:MongoDB C# How to Update GridFS File and metadata?MongoDB C# 如何更新 GridFS 文件和元数据?
【发布时间】:2014-05-25 19:12:46
【问题描述】:

需要一个解决方案来查看网格文件是否存在,然后使用元数据更新文件。

我正在使用以下解决方案。但想要一个更好的。

不要介意有单独的 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

【问题讨论】:

    标签: vb.net mongodb-.net-driver gridfs


    【解决方案1】:

    当您使用现有文件名上传文件时,MongoGridFS Upload 方法会获取文件的新版本。

    使用具有现有文件名的 OpenWrite 会更新文件。 C# 驱动程序是唯一允许就地更新 GridFS 文件的驱动程序。

    More information here

    【讨论】:

      【解决方案2】:

      与其尝试覆盖当前文件,为什么不直接触发删除命令,然后重新上传文件并将文档更新为旧的 Id?

      【讨论】:

      • 感谢您的回复。问题是在更新现有文件的过程中,它处于不一致的状态(fs.files 元数据中的长度和 md5 值在您再次关闭文件之前无效,更不用说数据正在更改) .这意味着其他进程可能会看到文件的中间版本和不一致版本,并且由于某种原因导致 GridFS 文件永久损坏,更新崩溃。另一方面,当只有几个字节发生变化时,就地更新现有文件可能会带来巨大的性能提升。
      • 以上解决方案有效,但想要更好的解决方案。我想到了删除并再次上传。但想象这是文件的批量插入。在保存之前必须检查文件是否存在。
      【解决方案3】:

      您可以像使用任何其他集合一样使用 fs.files 和 fs.chnuks 集合,但您必须小心保持对 GridFS 数据的重要性不受影响。

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        • 2014-11-16
        • 2012-05-04
        • 1970-01-01
        相关资源
        最近更新 更多