7
respostas

lookup de 2 collections

collection filters

{
    _id: "teste de id",
    category:"category name",
    subcategories: [{
        _id: "id subcategoria 1,
        name:"subcategoria 1"
    }]
}

collection company

{
    _id: "id company",
    products: [{
        _id: "testedeId",
        name: "nome do produto,
        subcategories : ["id da subcategoria 1","id da subcategoria 2"]
    }]
}

tendo as duas collections, gostaria de saber como faço para, através de um $lookup, trazer cada item de produto com as subcategorias referentes, por exemplo:

products: [{
    _id: "testedeId",
    name: "nome do produto,
    subcategories : ["id da subcategoria 1","id da subcategoria 2"],
    sub:[{
        _id: "id subcategoria 1,
        name:"subcategoria 1"
    }]
}]
7 respostas

Oi Guilherme, tudo bem? Deixa eu ver se entendi, você tem 3 coleções, certo? Products, Filters e Company.

Você quer selecionar tudo de Products que são das subcategorias de Company, trazendo também cada uma das subcategorias encontradas no Filters?

não, no caso eu tenho duas coleções, products é uma field da collection company, então eu quero fazer um find dos produtos, só que queria que cada produto viesse com os dados das subcategorias da collection filters. por exemplo: collection fitlers

{
    _id: 1,
    category: "nome da categoria",
    subcategory: [{
        _id: 1,
        name: "nome da subcategoria"
    }]
}

collection company

{
    _id: 1,
    products:[{
        _id: 1,
        nome: "nome do produto",
        subcategories: ["id da subcategoria"]
    }]
}

find desejado

{
    _id: 1,
    products:[{
        _id: 1,
        nome: "nome do produto",
        subcategories: ["id da subcategoria"],
        allsubcategories: [{
            _id : "id da subcategoria",
            name: "nome da subcategoria"
        }]
    }]
}

a intenção é que o objeto subcategoria presente na collection filters, venha junto com os produtos relacionados, do tipo, as subcategorias que o produto pertence

Então acho que a gente pode tentar algo assim:

db.company.aggregate( [
    { 
        $unwind: "$products" 
    },
    {
        $lookup : {
            from: "filters",
            localField: "subcategories",
            foreignField: "subcategory",
            as: "allsubcategories"
        }
    },
])

Mas ainda acho que você vai ter problemas por que subcategory é um array e não um único elemento. Mas testa ai. Se não der certo, vamos ter que estudar a questão dos pipelines, que não me pareceu simples....

testei o código, realmente não traz as subcategorias e ela é inserida no final como um field adicional.

{
        "_id" : ObjectId("5a8cd912ab270699828e5eb2"),
        "name" : "teste",
        "products" : {
                "id" : ObjectId("5a9c31b16d279c205837383e"),
                "name" : "bebida",
                "types" : [
                        {
                                "price" : "3.99",
                                "measurement" : "ml",
                                "quantity" : "300"
                        }
                ],
                "description" : "",
                "subcategories" : [
                        ObjectId("5a8ca3d4680d4da873d35cc7")
                ]
        },
        "allsubcategories" : [ ]
}

Espera, funcionou, mas as subcategorias não estão aparecendo no novo campo, é isso mesmo?

isso, o código funcionou, porém as subcategorias não aparecem no novo campo e o campo "allsubcategories", deveria estar dentro de "products", sendo a relação de quais subcategorias o produto possui

Se a gente usar o $produtos no as, será que resolve o segundo problema?

 as: "$products.allsubcategories"