Учитывая простейшие отношения, как показано ниже:
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
объект вместо массива