【问题标题】:'Public member 'Find' on type 'MongoCollectionImpl(Of BsonDocument)' not found.''未找到类型'MongoCollectionImpl(Of BsonDocument)'上的公共成员'Find'。
【发布时间】:2021-03-10 09:07:40
【问题描述】:

我正在尝试从与给定 ID 匹配的 mongodb 集合中查找特定用户。 Folliwng 是我的 VB.Net 代码。但是,我不断收到错误'Public member 'Find' on type 'MongoCollectionImpl(Of BsonDocument)' not found.'

  Public Function GetCollectionByName(ByVal collectionName As String)
    Dim db As IMongoDatabase = DBcontext()
    Dim collection As IMongoCollection(Of BsonDocument)

    collection = db.GetCollection(Of BsonDocument)(collectionName)

    Return collection
  End Function


   Public Function GetUser(ByVal id As String)
    Dim filter = Builders(Of BsonDocument).Filter.Eq(Of String)("ID", id)
    Dim collection = GetCollectionByName("Users")
    Dim list = collection.Find(filter).ToList()`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ERROR here

    Return list
   End Function

【问题讨论】:

    标签: vb.net mongo-collection mongodb.driver


    【解决方案1】:

    首先,您必须拥有Option Strict Off 才能编译该代码。那很糟。您应该立即在项目属性中打开Option Strict On 并解决它提出的所有问题。其中之一是您的GetCollectionByName 没有声明返回类型。这意味着这里:

    Dim list = collection.Find(filter).ToList()
    

    collection 变量是隐式类型Object 并且您在调用Find 方法时依赖后期绑定,因为Object 类没有这样的方法。因此,您无法从 Intellisense 获得任何帮助,而且如果您正确执行此操作,Intellisense 会告诉您哪些成员可用和不可用。

    无论如何,如果您确实阅读了有关您使用的类型的文档以查看它们具有哪些成员,您仍然可以使其工作。 Here 是您在该 GetCollectionByName 方法中使用的接口的文档,我不了解您,但我没有看到那里列出任何 Find 方法。有一个FindSync 方法,所以也许这就是你真正想要的。如果你有 Option Strict On 并且在任何地方都使用了正确的类型,那么 Intellisense 就会向你展示这一点。

    您还应该在 IDE 选项中打开 Option Strict On,以便将来所有项目都使用 On

    我查看了一些有关 Java 的 MongoCollectionImpl 的文档,那里似乎有一个 find 方法,但这并不一定意味着相同的方法在 .NET 中可用并且您没有工作反正直接和那个班级一起。您正在使用IMongoCollection,因此您应该只使用该接口的成员。基本上,您的代码需要看起来更像下面的Option Strict On

    Public Function GetCollectionByName(ByVal collectionName As String) As IMongoCollection(Of BsonDocument)
        Dim db As IMongoDatabase = DBcontext()
        Dim collection As IMongoCollection(Of BsonDocument)
    
        collection = db.GetCollection(Of BsonDocument)(collectionName)
    
        Return collection
    End Function
    
    Public Function GetUser(ByVal id As String) As List(Of BsonDocument)
        Dim filter = Builders(Of BsonDocument).Filter.Eq(Of String)("ID", id)
        Dim collection = GetCollectionByName("Users")
        Dim list = collection.FindSync(filter).ToList()
    
        Return list
    End Function
    

    如果您想使用接口,您可能需要将GetUser 方法声明为IList(Of BsonDocument) 类型。您可能也应该重命名该方法或更改实现。如果方法返回一个列表,则名称不应表明它返回单个项目。

    【讨论】:

    • 感谢您的所有解释。所有 cmets 都帮助修复了我的代码中的多个现有问题。我最终不得不在我需要 String 的地方更改 GetUser Function 的整个实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多