【问题标题】:Retrieve distinct values from Mongodb using Mongodb.Driver使用 Mongodb.Driver 从 Mongodb 中检索不同的值
【发布时间】:2021-01-13 19:39:39
【问题描述】:

我正在尝试使用 VB.Net(类似于 C#.Net)从 MongoDB 集合中返回不同文件类型的列表。由于每个文档都有一个唯一的id,无论文件类型如何,代码都会返回重复项。我在这里想念什么?我试过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 作用于查询结果集中的整个对象/记录。如果您要查找不同文件名的列表,只需查询文件名属性
  • 或者不确定它是否有效,但也许是 Distinct 的自定义谓词?
  • @Hursey 你能提供一些示例代码或sn-p 你的意思吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    只是为了将来如果有人需要代码示例,我将发布答案。虽然@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
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多