MongoDB 3.4.4以降のバージョンの使用:
db.coll.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
上記のパイプラインは最終出力を生成します
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
説明
パイプラインを分解して、個々のオペレーターの結果を表示できます。
$ objectToArray
動的キー(システム変数 $$ ROOT
)元のドキュメントの各フィールド/値のペアの要素を含む配列に変換します。戻り配列の各要素は、2つのフィールドkとvを含むドキュメントです。 $ project
ステージ
db.coll.aggregate([
{ "$project": {
"keys": { "$objectToArray": "$$ROOT" }
} }
])
収量
{
"_id" : 1,
"keys" : [
{
"k" : "_id",
"v" : 1
},
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
},
{
"k" : "key2",
"v" : {
"samekeyA" : "value3",
"samekeyB" : "value4"
}
},
{
"k" : "key3",
"v" : {
"samekeyA" : "value5",
"samekeyB" : "value6"
}
}
]
}
$ filter
演算子は、 <によって生成された配列のフィルタリングメカニズムとして機能します。 code> $ objectToArray
演算子は、クエリになる指定された条件に基づいて返す配列のサブセットを選択することによって機能します。
条件{"samekeyA": "value1"}
に一致するキー/値ペアの配列を返す次のパイプラインについて考えてみます。
db.coll.aggregate([
{ "$project": {
"keys": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
} }
])
これにより
{
"_id" : 1,
"keys" : [
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
}
これにより、上記のフィルター処理された配列が
から変換されます。[
{
"k" : "key1",
"v" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
]
動的キーを使用して元のドキュメントに
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
パイプラインを実行する
db.coll.aggregate([
{ "$project": {
"key": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": {
"$eq": [
"$$el.v.samekeyA",
"value1"
]
}
}
}
}
} }
])
生成します
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
これにより、フィルタリングされた動的キードキュメントがトップレベルに昇格し、他のすべてのフィールドが置き換えられます。この操作により、 _id
を含む、入力ドキュメント内の既存のすべてのフィールドが置き換えられます。 分野。
基本的に、これは上記のドキュメントを変換します
{
"_id" : 1,
"key" : {
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}
}
目的の最終出力に
{
"key1" : {
"samekeyA" : "value1",
"samekeyB" : "value2"
}
}