MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb:calculado connectToField dentro do graphlookup


connectToField é um nome, não uma expressão. Você não pode fazer nada com isso.

Você realmente precisa reconsiderar o esquema. Ele é falho de várias maneiras, começando com nomes não exclusivos usados ​​nas referências dos pais. Como você confia na string do caminho , você precisa de um caminho para fazer referência ao pai.

A resposta abaixo é tempo de execução e dificilmente é aconselhável para consultas operacionais devido à ineficiência de desempenho e algumas suposições de como o caminho é construído. No entanto, pode ser usado como um pedido único.

Basicamente, você precisa criar uma visualização com caminho pai calculado:
db.createView("rootless_tree", "tree", [
    { $match: { parent: { $ne: null } } },
    { $addFields: {
        parent_path: { $let: {
            vars: { parents: { $split: [ "$path", "#" ] } },
            in: { $reduce: {
                input: { $slice: [ "$$parents", 1, { $subtract: [ { $size: "$$parents" }, 2 ] } ] },
                initialValue: "",
                in: { $concat: [ "$$value", "#", "$$this" ] }
            } }
        } }
    } }
]);

Então você pode fazer sua pesquisa conforme recomendado na sua pergunta anterior:
db.tree.aggregate([
    { $graphLookup: {
        from: "rootless_tree", 
        startWith: "$path", 
        connectFromField: "path", 
        connectToField: "parent_path", 
        as:"dep"
    } },
    { $match: { dep: [] } },                       
])