0

次のようなコレクションがあります。

[{
    "org": "A",
    "type": "simple",
    "payFor": 3,
    "price": 100
},
{
    "org": "A",
    "type": "custom",
    "payFor": 2,
    "price": 115
},
{
    "org": "B",
    "type": "simple",
    "payFor": 1,
    "price": 110
},
{
    "org": "B",
    "type": "custom",
    "payFor": 2,
    "price": 200
},
{
    "org": "B",
    "type": "custom",
    "payFor": 4,
    "price": 220
}]

また、「type」の最初の「payFor」価格に対してのみ支払いが表示される「org」によるグループを実行するためのクエリで結果を生成する必要があります。$slice演算子で式の結果を使用しようとしています$addが、これは機能しません。

パイプライン:

[{
    "$group": {
        "_id": {
            "org": "$org",
            "type": "$type"
        },
        "payFor": {
            "$max": "$payFor"
        },
        "count": {
            "$sum": 1
        },
        "prices": {
            "$push": "$price"
        }
    }
},
{
    "$group": {
        "_id": "$_id.org",
        "payments": {
            "$push": {
                "type": "$_id.type",
                "forFirst": "$payFor",
                "sum": {
                    "$cond": [
                        {
                            "$gte": [
                                "$payFor",
                                "$count"
                            ]
                        },
                        {
                            "$add": {
                                "$prices": {
                                    "$slice": "$count"
                                }
                            }
                        },
                        {
                            "$add": "$prices"
                        }
                    ]
                }
            }
        }
    }
}]

巻き戻された価格をトラバースして、それらの「payFor」カウントのみを選択できることを私は知っています。ただし、結果のコレクションは上記の例よりも豊富であり、この操作により不必要なオーバーヘッドが発生します。

コミュニティからのアドバイスが必要です。お願いします。ありがとう。

4

0 に答える 0