Отношения в MongoDB (с использованием .Net) - PullRequest
2 голосов
/ 02 июня 2019

В любом случае, есть ли в mongoDB использование .Net для создания своего рода эквивалента SQL-Join?Я прочитал документы MongoDB (https://docs.mongodb.com/manual/tutorial/model-referenced-one-to-many-relationships-between-documents/) относительно отношений .. и из того, что я понимаю, вы просто добавляете отношения, ссылаясь на их идентификаторы. Однако ... означает ли это, что для каждого отношения вам также нужно сделать одну дополнительнуюзапрос? ..

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Учитывая простейшие отношения, как показано ниже:

db.publishers.save({
    _id: "oreilly",
    name: "O'Reilly Media",
    founded: 1980,
    location: "CA"
})

db.books.save({
    _id: 123456789,
    title: "MongoDB: The Definitive Guide",
    author: [ "Kristina Chodorow", "Mike Dirolf" ],
    published_date: ISODate("2010-09-24"),
    pages: 216,
    language: "English",
    publisher_id: "oreilly"
})

В MongoDB вы можете использовать оператор $ lookup для получения данных из обеих коллекций в одном запросе:

db.books.aggregate([
    {
        $lookup: {
            from: "publishers",
            localField: "publisher_id",
            foreignField: "_id",
            as: "publisher"
        }
    }
])

, который возвращает:

{ 
    "_id" : 123456789, 
    "title" : "MongoDB: The Definitive Guide", 
    "author" : [ "Kristina Chodorow", "Mike Dirolf" ], 
    "published_date" : ISODate("2010-09-24T00:00:00Z"), 
    "pages" : 216, 
    "language" : "English", 
    "publisher_id" : "oreilly", 
    "publisher" : [ { "_id" : "oreilly", "name" : "O'Reilly Media", "founded" : 1980, "location" : "CA" } ] 
}

Используя драйвер MongoDB .NET, вы можете использовать синтаксис LINQ и оператор join, которые будут переведены в $lookup:

var books = db.GetCollection<Book>("books");
var publishers = db.GetCollection<Publisher>("publishers");

var q = from book in books.AsQueryable()
        join publisher in publishers.AsQueryable() on
            book.publisher_id equals publisher._id
        select new
        {
            book,
            publisher = publisher
        };

var result = q.ToList();

который переводится в $lookup с $ unwind , так что вы получаете один publisher объект вместо массива

0 голосов
/ 04 июня 2019

если вы не возражаете против использования библиотеки, MongoDB.Entities может довольно легко создавать отношения без необходимости выполнять объединения вручную, если вы действительно не хотите: -)

иметьпосмотрите на код ниже, который демонстрирует отношения «один ко многим» между автором и сущностями книги.книжная сущность ничего не знает об авторах.но вы все равно можете получить доступ к обратным отношениям, предоставив либо идентификатор книги, массив идентификаторов книг или даже IQueryable книг.[Отказ от ответственности: я автор библиотеки]

using System;
using System.Linq;
using MongoDB.Entities;
using MongoDB.Driver.Linq;

namespace StackOverflow
{
    public class Program
    {
        public class Author : Entity
        {
            public string Name { get; set; }
            public Many<Book> Books { get; set; }

            public Author() => this.InitOneToMany(() => Books);
        }

        public class Book : Entity
        {
            public string Title { get; set; }
        }

        static void Main(string[] args)
        {
            new DB("test");

            var book = new Book { Title = "The Power Of Now" };
            book.Save();

            var author = new Author { Name = "Eckhart Tolle" };
            author.Save();

            author.Books.Add(book);

            //build a query for finding all books that has Power in the title.
            var bookQuery = DB.Queryable<Book>()
                              .Where(b => b.Title.Contains("Power"));

            //find all the authors of books that has a title with Power in them
            var authors = author.Books
                                .ParentsQueryable<Author>(bookQuery);

            //get the result
            var result = authors.ToArray();

            //output the aggregation pipeline
            Console.WriteLine(authors.ToString());


            Console.ReadKey();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...