如何从 C# Mongodb 强类型驱动程序中的文档加载特定字段
How to load specific fields from document(s) in C# Mongodb strongly typed driver
我正在使用官方 C# MongoDb 强类型驱动程序版本 2.5.0 与 MongoDB 进行交互。
我有 类 本书和页面如下:
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; }
}
我的问题是:
1-如何查询所有没有Pages字段的图书?目前这是我的代码:
var repository = _database.GetCollection<Book>("Books");
List<Book> allBooks = await repository.Find(_ => true).ToListAsync();
2-如何使用id字段获取单本书的title、authorName和publishYear字段而没有pages字段?目前这是我的代码:
var repository = _database.GetCollection<Book>("Books");
var filter = Builders<Book>.Filter.Eq("Id", bookId);
Book book = await repository.Find(filter).FirstOrDefaultAsync();
3-如何只获取一本书的页面字段作为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>();
您需要 Project
操作员。要仅排除特定字段,您可以这样做:
var allBooks = await repository.Find(_ => true)
.Project<Book>(Builders<Book>.Projection.Exclude(c => c.Pages))
.ToListAsync();
仅包含特定字段:
var allBooks = await repository.Find(_ => true)
.Project<Book>(Builders<Book>.Projection.Include(c => c.Pages))
.ToListAsync();
如果您需要 include\exclude 多个字段 - 多次调用(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();
我正在使用官方 C# MongoDb 强类型驱动程序版本 2.5.0 与 MongoDB 进行交互。
我有 类 本书和页面如下:
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; }
}
我的问题是:
1-如何查询所有没有Pages字段的图书?目前这是我的代码:
var repository = _database.GetCollection<Book>("Books");
List<Book> allBooks = await repository.Find(_ => true).ToListAsync();
2-如何使用id字段获取单本书的title、authorName和publishYear字段而没有pages字段?目前这是我的代码:
var repository = _database.GetCollection<Book>("Books");
var filter = Builders<Book>.Filter.Eq("Id", bookId);
Book book = await repository.Find(filter).FirstOrDefaultAsync();
3-如何只获取一本书的页面字段作为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>();
您需要 Project
操作员。要仅排除特定字段,您可以这样做:
var allBooks = await repository.Find(_ => true)
.Project<Book>(Builders<Book>.Projection.Exclude(c => c.Pages))
.ToListAsync();
仅包含特定字段:
var allBooks = await repository.Find(_ => true)
.Project<Book>(Builders<Book>.Projection.Include(c => c.Pages))
.ToListAsync();
如果您需要 include\exclude 多个字段 - 多次调用(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();