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ę.