12

我拿起了一段代码,它使用这样的 MongoDB 驱动程序从集合中获取单个对象……这不可能,对吗?有没有更好的方法来获得这个?

IMongoCollection<ApplicationUser> userCollection;
....
userCollection.FindAsync(x => x.Id == inputId).Result.ToListAsync().Result.Single();
4

4 回答 4

30

就在这里。

首先不要使用FindAsyncFind而是使用。在IFindFluent结果上使用SingleAsync扩展方法并在异步方法中等待返回的任务:

async Task MainAsync()
{
    IMongoCollection<ApplicationUser> userCollection = ...;

    var applicationUser = await userCollection.Find(_ => _.Id == inputId).SingleAsync();
}

新驱动程序专门使用 async-await。不要使用Task.Result.

于 2015-07-01T21:25:56.063 回答
7

您应该在执行之前限制您的查询,否则您将首先找到所有结果,然后只读取其中一个。

您可以使用FindOptionsin指定限制,也可以在执行查询之前FindAsync使用流畅的语法来限制查询:

var results = await userCollection.Find(x => x.Id == inputId).Limit(1).ToListAsync();
ApplicationUser singleResult = results.FirstOrDefault();

结果ToListAsync将是一个列表,但由于您将结果数限制为 1,因此该列表将只有一个结果,您可以使用 Linq 访问该结果。

于 2015-07-01T21:05:24.790 回答
2

在较新版本的 MongoDB Find() 中已弃用,因此您可以使用

collection.FindSync(o => o.Id == myId).Single()

或者

collection.FindAsync(o => o.Id == myId).Result.Single()

您也可以使用SingleOrDefault(), 如果未找到匹配项,则返回 null 而不是引发异常。

于 2021-04-20T18:10:23.313 回答
0

我无法获得方法:

coll.Find(_ => _.Id == inputId).SingleAsync();

在我遇到错误时工作

InvalidOperationException: Sequence contains more than one element c#

所以我最终使用.FirstOrDefault()

例子:

public FooClass GetFirstFooDocument(string templatename)
        {
            var coll = db.GetCollection<FooClass>("foo");
            FooClass foo = coll.Find(_ => _.TemplateName == templatename).FirstOrDefault();
            return foo; 
        }
于 2017-07-28T18:49:57.577 回答