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

コレクションのドキュメント内のさまざまなサブタイプの集約

    集計を使用して、スキーマを変更せずに必要な計算を行うことができます(ただし、このフィールドのクエリと集計を記述しやすくするために、スキーマを変更することを検討することもできます)。

    読みやすくするために、パイプラインを複数のステップに分割しました。また、読みやすくするために、ドキュメントを少し簡略化しました。

    サンプル入力:

    > db.md.find().pretty()
    {
        "_id" : ObjectId("512f65c6a31a92aae2a214a3"),
        "uid" : "x",
        "val" : "string"
    }
    {
        "_id" : ObjectId("512f65c6a31a92aae2a214a4"),
        "uid" : "x",
        "val" : "string"
    }
    {
        "_id" : ObjectId("512f65c6a31a92aae2a214a5"),
        "uid" : "y",
        "val" : "string2"
    }
    {
        "_id" : ObjectId("512f65e8a31a92aae2a214a6"),
        "uid" : "y",
        "val" : [
            "string3",
            "string4"
        ]
    }
    {
        "_id" : ObjectId("512f65e8a31a92aae2a214a7"),
        "uid" : "z",
        "val" : [
            "string"
        ]
    }
    {
        "_id" : ObjectId("512f65e8a31a92aae2a214a8"),
        "uid" : "y",
        "val" : [
            "string1",
            "string2"
        ]
    }
    

    パイプラインステージ:

    > project1 = {
        "$project" : {
            "uid" : 1,
            "val" : 1,
            "isArray" : {
                "$cond" : [
                    {
                        "$eq" : [
                            "$val.0",
                            [ ]
                        ]
                    },
                    true,
                    false
                ]
            }
        }
    }
    > project2 = {
        "$project" : {
            "uid" : 1,
            "valA" : {
                "$cond" : [
                    "$isArray",
                    "$val",
                    [
                        null
                    ]
                ]
            },
            "valS" : {
                "$cond" : [
                    "$isArray",
                    null,
                    "$val"
                ]
            },
            "isArray" : 1
        }
    }
    > unwind = { "$unwind" : "$valA" }
    > project3 = {
        "$project" : {
            "_id" : 0,
            "uid" : 1,
            "val" : {
                "$cond" : [
                    "$isArray",
                    "$valA",
                    "$valS"
                ]
            }
        }
    }
    

    最終集計:

    > db.md.aggregate(project1, project2, unwind, project3, group)
    {
        "result" : [
            {
                "_id" : "z",
                "vals" : [
                    "string"
                ]
            },
            {
                "_id" : "y",
                "vals" : [
                    "string1",
                    "string4",
                    "string3",
                    "string2"
                ]
            },
            {
                "_id" : "x",
                "vals" : [
                    "string"
                ]
            }
        ],
        "ok" : 1
    }
    


    1. monkを使用してリモートサーバーでホストされているmongodbに接続できません

    2. MongoDbでネストされた配列をクエリします

    3. MongoDB-エラー:無効なスキーマ、予期されるmongodb

    4. DoctrineMongoDBはidで検索します