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

深くネストされたドキュメントクエリでMongoDBの位置演算子$を使用する

    からエラーが発生します
    db.users.findOne(
        { username: 'test', 'kingdoms.buildings.type': 'castle' },
        { kingdoms: {$slice: [n, 1]}, 'kingdom.buildings.$': 1 }
    );
    

    スペルミスがあるため(「kingdom.buildings。$」は「kingdom s 」である必要があります) .buildings。$")。
    ただし、この方法では期待どおりの結果が得られません。
    $ 常に王国を対象としています kingdoms.buildingsのパスで -最初の配列。

    これは問題を解決できるはずの方法です。
    (V2.6 +が必要です)

    db.c.aggregate([ {
        $match : {
            username : 'test',
            'kingdoms.buildings.type' : 'castle'
        }
    }, {
        $project : {
            _id : 0,
            kingdoms : 1
        }
    }, {
        $redact : {
            $cond : {
                "if" : {
                    $or : [ {
                        $gt : [ "$kingdoms", [] ]
                    }, {
                        $gt : [ "$buildings", [] ]
                    }, {
                        $eq : [ "$type", "castle" ]
                    } ]
                },
                "then" : "$$DESCEND",
                "else" : "$$PRUNE"
            }
        }
    } ]).pretty();
    

    王国の最初の要素のみを予約する 、

    db.c.aggregate([ {
        $match : {
            username : 'test',
            'kingdoms.buildings.type' : 'castle'
        }
    }, {
        $redact : {
            $cond : {
                "if" : {
                    $or : [ {
                        $gt : [ "$kingdoms", [] ]
                    }, {
                        $gt : [ "$buildings", [] ]
                    }, {
                        $eq : [ "$type", "castle" ]
                    } ]
                },
                "then" : "$$DESCEND",
                "else" : "$$PRUNE"
            }
        }
    }, {
        $unwind : "$kingdoms"
    }, {
        $group : {
            _id : "$_id",
            kingdom : {
                $first : "$kingdoms"
            }
        }
    }, {
        $group : {
            _id : "$_id",
            kingdoms : {
                $push : "$kingdom"
            }
        }
    }, {
        $project : {
            _id : 0,
            kingdoms : 1
        }
    } ]).pretty();
    



    1. MongoDB-.explain()を使用してC#コードでクエリ情報を取得することはできませんか?

    2. 列挙型を文字列としてMongoDBに保存する

    3. 大文字と小文字を区別しない方法でMongodbを並べ替える

    4. 流星-角度での関係の処理