我对包含一百万份文档的集合进行了通配符搜索。
我可以直接从MongoDB控制台使用我的全文索引:
db.oneMillionDocumentsIndexed.find({$text: { $search: "raven" } } )
这会在一分钟后返回文档。
当我在单元测试中尝试相同的事情时,测试运行超过半小时而不返回任何文档:
[Test]
public void SearchTextFullText()
{
var credential = MongoCredential.CreateCredential("test", "readonlyUser", "password");
var settings = new MongoClientSettings
{
Credentials = new[] { credential },
Server = new MongoServerAddress("localhost")
};
var mongoClient = new MongoClient(settings);
var database = mongoClient.GetDatabase("test");
var collection = database.GetCollection<BsonDocument>("oneMillionDocumentsIndexed");
var searchWord = "raven";
var filter = Builders<BsonDocument>.Filter.Text(searchWord);
var documentCount = 0;
var stopwatch = new Stopwatch();
stopwatch.Start();
using (var cursor = collection.FindAsync(filter).Result)
{
while (cursor.MoveNext()) // <-- We never get past this point
{
var batch = cursor.Current;
foreach (var document in batch)
{
Console.WriteLine(document["_id"].AsObjectId.ToString());
Assert.That(document, Is.Not.Null);
documentCount++;
}
}
}
stopwatch.Stop();
Console.WriteLine($"Found {documentCount} documents. Total time {stopwatch.ElapsedMilliseconds}ms. Avg. {stopwatch.ElapsedMilliseconds / documentCount}");
}
终于完成了:找到158791个文件。总时间1670368ms。平均。 10
做27分50秒。
答案 0 :(得分:1)
Task.Result是一个阻塞调用(在本例中为collection.FindAsync(filter).Result),它将等待直到计算出完整的结果集然后它将返回。
你可以试试这个代码,我确信它会表现得更好(虽然未经过测试)
using(var cursor = await collection.Find(filter).ToCursorAsync())
{
while(await cursor.MoveNextAsync())
{
//rest of logic ....
答案 1 :(得分:0)
不确定您使用的是哪种版本的mongoDb驱动程序,但是可以试试这个
while (cursor.MoveNextAsync().Result)