【问题标题】:MongoDb FindAsync Cursor with Filter always returning null带有过滤器的 MongoDb FindAsync 游标始终返回 null
【发布时间】:2015-06-24 15:41:12
【问题描述】:

我使用以下代码按字段名称过滤集合。但是result.Current 始终是null,而数据存在于MongoCollection 中。有什么想法吗?

代码

public async Task<IdentityUser> FindByNameAsync(string userName)
        {
            if (string.IsNullOrEmpty(userName))
            {
                throw new ArgumentException("Null or empty argument: userName");
            }

            var filter = Builders<IdentityUser>.Filter.Eq("UserName", userName);
            var result = await _collection.FindAsync(filter);

            if (result != null && result.Current != null && result.Current.Count() == 1)
            {
                return result.Current.Single();
            }

            return null;
        }

Mongo 文档

{
    "_id": {
        "$oid": "558acd1768869a0f6c45ab78"
    },
    "CreatedBy": 0,
    "UpdatedBy": 0,
    "CreatedTime": {
        "$date": "2015-06-24T15:30:28.336Z"
    },
    "UpdatedTime": {
        "$date": "0001-01-03T00:00:00.000Z"
    },
    "UserName": "test",
    "Email": null,
    "EmailConfirmed": false,
    "PasswordHash": "test",
    "SecurityStamp": null,
    "PhoneNumber": null,
    "PhoneNumberConfirmed": false,
    "TwoFactorEnabled": false,
    "LockoutEndDateUtc": null,
    "LockoutEnabled": false,
    "AccessFailedCount": 0
}

【问题讨论】:

    标签: c# mongodb mongodb-.net-driver


    【解决方案1】:

    对于简单查询(您的情况),您应该使用 next:

    var user = await collection.Find(x => x.UserName != userName).FirstAsync();
    

    您尝试使用光标。当查询可以返回大量数据时才有意义,在这种情况下,下一个使用游标:

    var cursor = await collection.FindAsync(x => x.UserName != userName);
    while (await cursor.MoveNextAsync())
    {
          var listOfUsers = cursor.Current;
    }
    

    PS:Find - 返回结果,FindAsync - 返回光标

    【讨论】:

    • 在 C# 8.0 中,如果方法返回 IEnumerable,则可以在 while 循环中使用 yield return cursor.Current。更清洁和适当的异步。
    • 谢谢 这是我前两天发现的
    【解决方案2】:

    基本的异步形式

       data= await collectin.FindAsync(new BsonDocument {{ "_id", new ObjectId(id) } }).Result.FirstAsync();
    

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多