使用 Mongodb.Driver 从 Mongodb 中检索不同的值

Retrieve distinct values from Mongodb using Mongodb.Driver

我正在尝试使用 VB.Net(类似于 C#.Net)从 MongoDB 集合中 return 不同文件类型的列表。由于每个文档都有一个唯一的 id,无论文件类型如何,代码 return 都是重复的。我在这里错过了什么?我试过 GroupBy 但没用。

Public Function GetAllFileTypes() As List(Of UXFiles)
        Dim m_List As New List(Of UXFiles)

        Dim db As IMongoDatabase = DatabaseService.GetDBcontext()
        Dim files = db.GetCollection(Of BsonDocument)("Files").Find(New BsonDocument).ToList
        m_List = files.Select(Function(_file) ConvertFile(_file)).Distinct().ToList()

        Return m_List
    End Function


    Private Function ConvertFile(fileDocument As BsonDocument) As UXFiles

        Dim file As New UXFiles With {
            .ID = If(fileDocument.Contains("id"), fileDocument.GetElement("id").Value.ToString, ""),
            .Name = If(fileDocument.Contains("name"), fileDocument.GetElement("name").Value.ToString, ""),
            .Type = If(fileDocument.Contains("type"), fileDocument.GetElement("type").Value.ToString, "")
        }
        Return file
    End Function

Distinct 从结果集中消除重复结果。如果在结果中包含每个文档的 _id,则不会有重复项,因为每个 _id 都是唯一的。您需要投影一些字段(例如,文件类型,如果您想知道存在哪些文件类型)或使用类似 $group 和 $first.

为了将来如果有人需要代码示例,我将发布答案。尽管@D.SM的想法帮助我解决了这个问题。

为了解决这个问题,我使用 Project 排除了 _id 的唯一值,然后我根据 属性 type 对结果进行了分组。

  Public Function GetAllFileTypes() As List(Of UXFiles)

        Dim m_List As New List(Of UXFiles)

        Dim db As IMongoDatabase = DatabaseService.GetDBcontext()
        Dim project = Builders(Of BsonDocument).Projection.Include("type").Exclude("_id")

        Dim bsonDocuments = db.GetCollection(Of BsonDocument)("Files").Find(New BsonDocument).Project(project).ToList
        m_List = bsonDocuments.Select(Function(_file) ConvertFile(_file)).ToList()

        Dim distinctList = m_List.GroupBy(Function(x) x.Type).Select(Function(x) x.First).ToList


        Return distinctList
  End Function