c#mongo 2.0减少FindAsync的流量

时间:2015-10-04 21:34:20

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

我必须从数据库中的每个文档中获取一些次要数据,但我仍然希望减少流量以防止“表扫描”(只是术语,我知道它不是表格)。

我有一个让我们说“书籍”的集合(只是因为每个人都用它来举例),现在,我的问题是我只想要给定作者的书籍。

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数据库中称为“视图”。

2 个答案:

答案 0 :(得分:17)

您可以通过projection缩小返回文档的大小,您可以在FindOptions FindAsync参数中设置,只包含您需要的字段:

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个对象,因为它们只包含投影字段。

答案 1 :(得分:0)

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

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