Hej
Mam pytanie czy możliwe jest połączenie danych w liście kluczem obcym z jednym elementem z innej kolekcji tak aby ten powiązany element był bezpośrednio w elemencie z listy?
Zacznę od początku
Tam kolekcje:
Languages: _id, Code, Name, PriceLevelSymbol, IsDefault
Users: _id, Login, Email, LanguageId, PriceLevelSymbol, Roles, Password, Salt
Products: _id, Sku, ProductTranslates [ { LanguageId, Name, Description} ], PriceLevels [ {Symbol, Value } ]
Orders: _id, UserId, Title, Description, ProductsOrder [ {ProductId, Price, Discount, Quantity } ]
W kolekcji **Orders ** przykładowy dokument to:
{
"_id" : ObjectId("5b817c5aacb79a17a4542dea"),
"UserId" : ObjectId("5b817c59acb79a17a453be97"),
"Title" : "TITLE_68ac9dbd-0971-4ac8-8846-42499d4f5e87",
"Description" : "DESCRIPTION_68ac9dbd-0971-4ac8-8846-42499d4f5e87",
"ProductsOrder" : [
{
"ProductId" : ObjectId("5b817c5aacb79a17a4542b9a"),
"Price" : "99.8735604807146",
"Discount" : "0",
"Quantity" : 16.0
}
]
}
Stworzyłem agregację
db.getCollection("orders").aggregate(
[
{
"$lookup" : {
"from" : "users",
"localField" : "UserId",
"foreignField" : "_id",
"as" : "User"
}
},
{
"$unwind" : {
"path" : "$User"
}
},
{
"$lookup" : {
"from" : "products",
"localField" : "ProductsOrder.ProductId",
"foreignField" : "_id",
"as" : "Products"
}
}
]
);
I wynik danych mam taki:
{
"_id" : ObjectId("5b817c5aacb79a17a4542dea"),
"UserId" : ObjectId("5b817c59acb79a17a453be97"),
"Title" : "TITLE_68ac9dbd-0971-4ac8-8846-42499d4f5e87",
"Description" : "DESCRIPTION_68ac9dbd-0971-4ac8-8846-42499d4f5e87",
"ProductsOrder" : [
{
"ProductId" : ObjectId("5b817c5aacb79a17a4542b9a"),
"Price" : "99.8735604807146",
"Discount" : "0",
"Quantity" : 16.0
}
],
"User" : {
"_id" : ObjectId("5b817c59acb79a17a453be97"),
"Login" : "login_7b66e96a-fd24-4c29-8ca3-3c8f7d30bdc9",
"Password" : "secret",
"Salt" : "salt",
"Email" : "[email protected]",
"Roles" : [
NumberInt(3)
],
"LanguageId" : ObjectId("5b817c59acb79a17a453a3bc"),
"PriceLevelSymbol" : "PRICE_1"
},
"Products" : [
{
"_id" : ObjectId("5b817c5aacb79a17a4542130"),
"Sku" : "SKU_d205dc7b-732c-4868-9259-5e905a7f086d",
"PriceLevels" : [
{
"Symbol" : "PRICE_1",
"Value" : "32.9068409432223"
},
{
"Symbol" : "PRICE_2",
"Value" : "96.7108488067569"
}
],
"ProductTranslates" : [
{
"LanguageId" : ObjectId("5b817c59acb79a17a453ac6f"),
"Name" : "NAME_d205dc7b-732c-4868-9259-5e905a7f086d",
"Description" : "DESCRIPTION_d205dc7b-732c-4868-9259-5e905a7f086d"
}
]
}
]
}
Jednak chciałbym żeby szczegółowe informacje o produkcie (z kolekcji "products") znajdowały się bezpośrednio w ProductsOrder czyli
{
"_id" : ObjectId("5b817c5aacb79a17a4542dea"),
"UserId" : ObjectId("5b817c59acb79a17a453be97"),
"Title" : "TITLE_68ac9dbd-0971-4ac8-8846-42499d4f5e87",
"Description" : "DESCRIPTION_68ac9dbd-0971-4ac8-8846-42499d4f5e87",
"ProductsOrder" : [
{
"ProductId" : ObjectId("5b817c5aacb79a17a4542b9a"),
"Price" : "99.8735604807146",
"Discount" : "0",
"Quantity" : 16.0,
"Product": {
"_id" : ObjectId("5b817c5aacb79a17a4542130"),
"Sku" : "SKU_d205dc7b-732c-4868-9259-5e905a7f086d",
"PriceLevels" : [
{
"Symbol" : "PRICE_1",
"Value" : "32.9068409432223"
},
{
"Symbol" : "PRICE_2",
"Value" : "96.7108488067569"
}
],
"ProductTranslates" : [
{
"LanguageId" : ObjectId("5b817c59acb79a17a453ac6f"),
"Name" : "NAME_d205dc7b-732c-4868-9259-5e905a7f086d",
"Description" : "DESCRIPTION_d205dc7b-732c-4868-9259-5e905a7f086d"
}
]
}
}
],
"User" : {
"_id" : ObjectId("5b817c59acb79a17a453be97"),
"Login" : "login_7b66e96a-fd24-4c29-8ca3-3c8f7d30bdc9",
"Password" : "secret",
"Salt" : "salt",
"Email" : "[email protected]",
"Roles" : [
NumberInt(3)
],
"LanguageId" : ObjectId("5b817c59acb79a17a453a3bc"),
"PriceLevelSymbol" : "PRICE_1"
}
}
Czy jest możliwość wykonania takiej projekcji w agregacji ? czy muszę to połączyć bezpośrednio w aplikacji (.NET)?
Dodam, że dopiero zaczynam z mongo więc jeżeli to co robię należy wykonać w relacyjnej bazie danych to też proszę o taką informację.