c# mongo 2.0 减少 FindAsync 的流量

c# mongo 2.0 reduce traffic of FindAsync

我必须从数据库中的每个文档中获取一些次要数据,但我仍然想减少流量以防止 "Table-Scan"(只是术语,我知道它不是表格)。

我有一个集合可以说 "Books"(只是因为每个人都用它来举例说明),现在,我的问题是我只想要给定作者的书名。

var filter = Builders<Book>.Filter.Eq(n => n.Author, AuthorId);

            List<string> books = new List<string>();

            using (var cursor = await BooksCollection.FindAsync(filter))
            {
                while (await cursor.MoveNextAsync())
                {
                    var batch = cursor.Current;
                    foreach (Book b in batch)
                        books.Add(b.Title);
                }
            }

但是,当我扫描整个收集结果时,我正在使用大块数据,不是吗?让我们假设那些不是书籍,而是整个网格网络,每个文档大约 5-10 MB,而我有数千个。我如何减少这里的流量,而不将我需要的这些数据存储在另一个集合中?

编辑 我认为它在 SQL 数据库中称为 "Views"。

您可以通过 projection 减小返回文档的大小,您可以在 FindAsyncFindOptions 参数中设置它以仅包含您需要的字段:

var filter = Builders<Book>.Filter.Eq(n => n.Author, AuthorId);
// Just project the Title and Author properties of each Book document
var projection = Builders<Book>.Projection
    .Include(b => b.Title)
    .Include(b => b.Author)
    .Exclude("_id"); // _id is special and needs to be explicitly excluded if not needed
var options = new FindOptions<Book, BsonDocument> { Projection = projection };

List<string> books = new List<string>();

using (var cursor = await BooksCollection.FindAsync(filter, options))
{
    while (await cursor.MoveNextAsync())
    {
        var batch = cursor.Current;
        foreach (BsonDocument b in batch)
            // Get the string value of the Title field of the BsonDocument
            books.Add(b["Title"].AsString);
    }
}

请注意,返回的文档是 BsonDocument 对象而不是 Book 对象,因为它们只包含投影字段。

除了已接受的答案外,您还可以将表达式应用于投影以进行转换,其工作方式类似于 Linq 的 .Select() 方法:

var projection = Builders<Page>.Projection.Expression(x => new Page { Title = x.Title });