Как объединить две коллекции, используя оператор поиска в C # Mongodb строго типизированный драйвер - PullRequest
1 голос
/ 07 мая 2019

Я использую официальный строго типизированный драйвер 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 в документе Book без использования Linq и с помощью оператора поиска и структуры агрегации.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Если вы используете определение взгляда в Visual Studio, оно покажет, чего ожидать, как показано на рисунке ниже, в окружении красного цвета.

enter image description here

Первый поиск является расширением коллекции 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; }
}

Подробнее о Как программировать с MongoDB с помощью драйвера .NET

0 голосов
/ 08 мая 2019

Вы можете довольно легко создавать отношения один-к-одному, один-ко-многим-ко-многим с библиотекой-оболочкой 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();
        }
    }
}
...