代码之家  ›  专栏  ›  技术社区  ›  Waxren

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

  •  4
  • Waxren  · 技术社区  · 6 年前

    我使用官方的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-如何查询没有页面字段的所有书籍?目前这是我的代码:

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

    2-如何使用id字段仅获取标题、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>();
    
    1 回复  |  直到 6 年前
        1
  •  9
  •   Evk    6 年前

    你需要 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(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();