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 减小返回文档的大小,您可以在 FindAsync
的 FindOptions
参数中设置它以仅包含您需要的字段:
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 });
我必须从数据库中的每个文档中获取一些次要数据,但我仍然想减少流量以防止 "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 减小返回文档的大小,您可以在 FindAsync
的 FindOptions
参数中设置它以仅包含您需要的字段:
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 });