如何在C#Mongodb强类型驱动程序中使用查找运算符联接两个集合

时间:2019-05-07 11:39:43

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

我正在使用官方的C#MongoDb强类型驱动程序版本2.8.0与MongoDB进行交互。

请考虑以下课程:

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

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string BirthDate { get; set; }

    public string ScientificDegree { get; set; }
}

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

    public string AuthorId {get; set;}

    public string Title { get; set; }

    public int PublishYear { get; set; }

    public string Content { get; set; }

    public bool IsVerified { get; set; }

    public int DownloadCount {get; set; }
}

如何通过作者文档中的Id字段和书籍文档中的AuthorId字段(不使用Linq以及使用查找运算符和聚合框架)来(一对一)联接这两个集合。

2 个答案:

答案 0 :(得分:1)

如果使用Visual Studio的peek定义,它将显示期望的Lookup,如下图所示,用红色包围。

enter image description here

第一个Lookup是IMongoCollection的扩展。它在集合的上下文中执行,并且需要外键集合作为第一个参数,然后是建立关系的本地字段,构成关系的外字段,最后是结果类型。不幸的是,结果类型不能是匿名类型(或者我没有发现如何匿名?)。一如既往地期望从外部集合中返回不止一个元素,因此,运算符始终希望返回一个数组。

对于您而言,结果将显示在下面的代码段中。您还应该创建“ LookedUpBooks”类。

 var result = await collBooks.Aggregate()
                .Lookup<Books, Authors, LookedUpBooks>(collAuthors, 
                    x => x.AuthorId, 
                    y => y.Id,
                    y => y.LastName
            ).ToListAsync();

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

     public string Title { get; set; }
// Add more properties as you need

     public IEnumerable<Authors> InnerAuthors { get; set; }
}

有关How to Program with MongoDB Using the .NET Driver的更多信息

答案 1 :(得分:0)

您可以使用MongoDB.Entities包装器库轻松地进行一对一,一对多,多对多关系。以下是如何与两个不同的集合进行一对一的关系。

using System.Linq;
using MongoDB.Entities;

namespace Library
{
    public class Author : Entity
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class Book : Entity
    {
        public string Title { get; set; }
        public One<Author> MainAuthor { get; set; } // one-to-one relationship
    }

    class Program
    {
        static void Main(string[] args)
        {
            new DB("library");

            var author1 = new Author
            {
                FirstName = "Eckhart",
                LastName = "Tolle"
            };
            author1.Save();

            var book1 = new Book
            {
                Title = "The Power Of Now",
                MainAuthor = author1.ToReference()
            };
            book1.Save();

            var powerOfNow = DB.Collection<Book>()
                               .Where(b => b.Title.Contains("Now"))
                               .FirstOrDefault();

            var eckhartTolle = powerOfNow.MainAuthor.ToEntity();
        }
    }
}