如何从 C# Mongodb 强类型驱动程序中的文档加载特定字段

Wax*_*ren 3 .net c# mongodb mongodb-query mongodb-.net-driver

我使用官方 C# MongoDb 强类型驱动程序版本 2.5.0 与 MongoDB 交互。

我有类 Book 和 Page 如下:

public class Book
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public string Title { get; set; }

    public string AuthorName { get; set; }

    public int PublishYear { get; set; }

    public List<Page> Pages { get; set; } = new List<Page>();

}


public class Page
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public int Number { get; set; }

    public string HTMLContent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1-如何在没有Pages字段的情况下查询所有书籍?目前这是我的代码:

var repository = _database.GetCollection<Book>("Books");
List<Book> allBooks = await repository.Find(_ => true).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

2-如何使用id字段在没有单本书的pages字段的情况下仅获取title、authorName和publishYear字段?目前这是我的代码:

var repository = _database.GetCollection<Book>("Books");
var filter = Builders<Book>.Filter.Eq("Id", bookId);
Book book = await repository.Find(filter).FirstOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

3-如何仅将一本书的 pages 字段作为List<Page>? 目前这是我的代码:

var repository = _database.GetCollection<Book>("Books");
var filter = Builders<Book>.Filter.Eq("Id", bookId);
Book book = await repository.Find(filter).FirstOrDefaultAsync();
List<Page> pages = book != null ? book.Pages : new List<Page>();
Run Code Online (Sandbox Code Playgroud)

Evk*_*Evk 6

你需要Project接线员。要仅排除特定字段,您可以这样做:

var allBooks = await repository.Find(_ => true)
    .Project<Book>(Builders<Book>.Projection.Exclude(c => c.Pages))
    .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

仅包含特定字段:

 var allBooks = await repository.Find(_ => true)
    .Project<Book>(Builders<Book>.Projection.Include(c => c.Pages))
    .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

如果您需要包含\排除多个字段 - 多次调用(Include(x => x.Title).Include(x => x.Title)等)。

仅包含您需要的替代方法:

var allBooks = await repository.Find(_ => true).Project(b => new Book {
    AuthorName = b.AuthorName,
    Id = b.Id,
    PublishYear = b.PublishYear,
    Title = b.Title
    // specify what you need, don't specify what you do not
    // like Pages
}).ToListAsync();
Run Code Online (Sandbox Code Playgroud)