使用 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
我正在尝试使用 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