sql >> データベース >  >> NoSQL >> MongoDB

Mongodb:graphlookup内の計算されたconnectToField

    connectToField は名前であり、表現ではありません。何もできません。

    あなたは本当にスキーマを再考する必要があります。親参照で使用されている一意でない名前から始めて、多くの点で欠陥があります。代わりにパス文字列に依存しているため、 、親を参照するためのパスが必要です。

    以下の回答は実行時のものであり、パフォーマンスが非効率的であるため、運用クエリにはほとんどお勧めできません パスがどのように構築されるかについてのいくつかの仮定。ただし、1回限りのリクエストとして使用できます。

    基本的に、ビュー を作成する必要があります 計算された親パスを使用:

    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" ] }
                } }
            } }
        } }
    ]);
    

    したがって、前の質問でアドバイスされたようにルックアップを行うことができます:

    db.tree.aggregate([
        { $graphLookup: {
            from: "rootless_tree", 
            startWith: "$path", 
            connectFromField: "path", 
            connectToField: "parent_path", 
            as:"dep"
        } },
        { $match: { dep: [] } },                       
    ])
    



    1. Express-sessionmongodbセッションが持続しない

    2. MongoDBスキーマ設計-小さなドキュメントが多いですか、それとも大きなドキュメントが少ないですか?

    3. 別のデータベースからのコレクションの更新

    4. Laravel Socket.io接続されていますが、データを受信して​​いません