web-dev-qa-db-ja.com

「オブジェクトの配列」をキー値の単純な配列にマッピングする

私はmongoDB集計パイプラインに不慣れで、本当に基本的な質問がありますが、どこにも答えが見つかりませんでした。次のブロックを単純に変換したいと思います。

"exclude" : [
            {
                "name" : "Accenture"
            }, 
            {
                "name" : "Aon Consulting"
            }
        ]

に:

"exclude" : [
            "Accenture",
            "Aon Consulting"
        ]

集約パイプラインを使用していますが、 https://docs.mongodb.com/manual/reference/operator/aggregation/ のドキュメントを調べても、その方法を見つけることができないようです。ご協力いただきありがとうございます。

9
Raeny von Haus

確かに、変換フレームワークを使用して変換を処理することは正しい方向でした。配列内のオブジェクトキーをキー値のみの配列にマップする主な演算子は$map この場合。

$addFieldsパイプライン内で一緒に使用して、変換されたフィールドを次のように射影します。

db.collection.aggregate([
    {
        "$addFields": {
            "exclude": {
                "$map": {
                    "input": "$exclude",
                    "as": "el",
                    "in": "$$el.name"
                }
            }
        }
    }
])

上記では、$addFieldsパイプラインステージがドキュメントに新しいフィールドを追加し、新しいフィールドの名前が既存のフィールド名と同じです(_idを含む)、$addFieldsは既存のフィールド名を上書きします指定した式の値を持つそのフィールドの値。

したがって、基本的に上記はexcludes配列を$mapを使用して変換された配列に置き換えます$mapは、入力配列の各要素に式を適用することによって機能します。式は、asフィールドで指定された変数名($$el)を使用して各要素を個別に参照し、適用された結果を含む配列を返します。

5
chridam

@chridamの答えは正しいですが、$mapを使用する必要はありません。単純な$addFields/$projectで十分です:

db.collection.aggregate([
    {
        $addFields: {
            exclude : '$exclude.name'
        }
    }
])
11
AlexDenisov