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

条件付きgroupbyステートメントを使用したMongoDBクエリ

    $ condのため、コードが機能しません アキュムレータ演算子ではありません。 これら のみ アキュムレータ演算子。$groupで使用できます。 ステージ。

    レコードに含まれる可能性のあるsourceの値が2つ以下であると想定します 質問で述べたように、条件付きの$projectを追加できます。 $groupをステージングして変更します ステージとして、

    コード:

        db.customer.aggregate([
            {
                $group: {
                    "_id": {
                        "id": "$id",
                        "firstName": "$firstName",
                        "lastName": "$lastName",
                        "code": "$code"
                    },
                    "sourceA": { $first: "$source" },
                    "sourceB": { $last: "$source" }
                }
            },
            {
                $project: {
                    "source": {
                        $cond: [
                            { $eq: ["$sourceA", "email"] },
                            "$sourceB",
                            "$sourceA"
                        ]
                    }
                }
            }
        ])
    

    sourceに2つ以上の可能な値がある可能性がある場合は、次のようにすることができます。

    • Group idによる 、firstNamelastName およびcodesourceの一意の値を累積する 、 $ addToSetを使用 オペレーター。
    • $ redactを使用します email以外の値のみを保持する 。
    • Project sourceの場合、必須フィールド 配列が空です(すべての要素が削除されています)。値を追加しますemail それに。
    • Unwind 配列ではなくフィールドとしてリストするソースフィールド。(オプション)

    コード:

        db.customer.aggregate([
            {
                $group: {
                    "_id": {
                        "id": "$id",
                        "firstName": "$firstName",
                        "lastName": "$lastName",
                        "code": "$code"
                    },
                    "sourceArr": { $addToSet: { "source": "$source" } }
                }
            },
            {
                $redact: {
                    $cond: [
                        { $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
                        "$$PRUNE",
                        "$$DESCEND"
                    ]
                }
            },
            {
                $project: {
                    "source": {
                        $map: {
                            "input":
                            {
                                $cond: [
                                    { $eq: [{ $size: "$sourceArr" }, 0] },
                                    [{ "source": "item" }],
                                    "$sourceArr"]
                            },
                            "as": "inp",
                            "in": "$$inp.source"
                        }
                    }
                }
            }
        ])
    



    1. Apollo / GraphQL:ネストされた要素を取得する方法は?

    2. 集計関数は、ページ更新時にng-repeatの項目を複製します。重複を止める方法を理解する必要があります。 AngularjsMongodbマングース

    3. AndroidフォンでCouchDbを使用し、サーバー側でmongodbを使用する

    4. Node/Mongoでの検索を理解する