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

MongoDB $ mergeObjects

    MongoDBでは、$mergeObjects 集約パイプラインオペレーターは、複数のドキュメントを1つのドキュメントに結合します。

    構文

    $mergeObjects 演算子は2つの構文をサポートします。

    構文1:

    { $mergeObjects: [ <document1>, <document2>, ... ] }

    構文2:

    { $mergeObjects: <document> }

    最初の構文は複数の引数を受け入れ、2番目の構文は1つの引数を受け入れます。

    構文1の例(複数の引数)

    最初の構文には、$mergeObjectsの提供が含まれます 複数の引数/ドキュメントを使用します。 $mergeObjects 次に、それらのドキュメントを1つに結合します。

    usersというコレクションがあるとします。 次のドキュメントで:

    {
    	"_id" : 1,
    	"name" : {
    		"f_name" : "Homer",
    		"l_name" : "Simpson"
    	},
    	"contact" : {
    		"email" : "[email protected]",
    		"ph" : null
    	}
    }

    $mergeObjectsを使用できます nameをマージします およびcontact フィールド:

    db.users.aggregate(
      [
        {
          $project:
            { 
              user: { $mergeObjects: [ "$name", "$contact" ] }
            }
        }
      ]
    ).pretty()

    結果:

    {
    	"_id" : 1,
    	"user" : {
    		"f_name" : "Homer",
    		"l_name" : "Simpson",
    		"email" : "[email protected]",
    		"ph" : null
    	}
    }

    この場合、両方のフィールドをuserという1つのフィールドにマージしました。 。より多くのフィールド/ドキュメントがあれば、必要に応じてそれらもマージできたはずです。

    重複するフィールド名

    マージするドキュメントに重複するフィールド名が含まれている場合は、$mergeObjects ドキュメントをマージするときにフィールドを上書きします。したがって、結果のドキュメントのフィールドには、そのフィールドに対してマージされた最後のドキュメントの値が含まれます。

    次のドキュメントがあるとします。

    {
    	"_id" : 2,
    	"name" : {
    		"f_name" : "Peter",
    		"l_name" : "Griffin"
    	},
    	"contact" : {
    		"email" : "[email protected]",
    		"f_name" : "Bart"
    	}
    }

    両方のドキュメントにf_nameという名前のフィールドが含まれていることがわかります。 。

    これらのドキュメントをマージすると、次のようになります。

    db.users.aggregate(
      [
        { $match: { _id: 2 } },
        {
          $project:
            { 
              user: { $mergeObjects: [ "$name", "$contact" ] }
            }
        }
      ]
    ).pretty()

    結果:

    {
    	"_id" : 2,
    	"user" : {
    		"f_name" : "Bart",
    		"l_name" : "Griffin",
    		"email" : "[email protected]"
    	}
    }

    f_name 結果のドキュメントのフィールドにBartが含まれます 、これは最後にマージされたドキュメントの値です。

    ヌル値

    ドキュメントをnullとマージする場合 、結果のドキュメントは変更なしで返されます。

    ただし、マージするすべてのドキュメントがnullの場合 、その後、空のドキュメントが返されます。

    次のドキュメントがあるとします。

    {
    	"_id" : 3,
    	"name" : {
    		"f_name" : "Hubert",
    		"l_name" : "Farnsworth"
    	},
    	"contact" : null
    }
    { "_id" : 4, "name" : null, "contact" : null }

    nameをマージすると次のようになります およびcontact これら2つのドキュメントのフィールド:

    db.users.aggregate(
      [
        { $match: { _id: { $in: [ 3, 4 ] } } },
        {
          $project:
            { 
              user: { $mergeObjects: [ "$name", "$contact" ] }
            }
        }
      ]
    )

    結果:

    { "_id" : 3, "user" : { "f_name" : "Hubert", "l_name" : "Farnsworth" } }
    { "_id" : 4, "user" : {  } }

    構文2の例(単一引数)

    単一引数構文を使用する2つの例を次に示します。

    $group ステージアキュムレータ

    最初の例では、$mergeObjects $groupとして使用されます ステージアキュムレータ。

    productsというコレクションがあるとします。 次のドキュメントを使用:

    {
    	"_id" : 1,
    	"product" : "Shirt",
    	"inventory" : {
    		"blue" : 10,
    		"red" : 2
    	}
    }
    {
    	"_id" : 2,
    	"product" : "Shirt",
    	"inventory" : {
    		"green" : 3,
    		"black" : 1
    	}
    }
    {
    	"_id" : 3,
    	"product" : "Shorts",
    	"inventory" : {
    		"blue" : 2,
    		"red" : 8
    	}
    }
    {
    	"_id" : 4,
    	"product" : "Shorts",
    	"inventory" : {
    		"green" : 5,
    		"black" : 3
    	}
    }

    これらのドキュメントをproductでグループ化できます フィールドをクリックし、$mergeObjectsを使用します inventoryをマージします 各グループのフィールド:

    db.products.aggregate( [
       { $group: { 
         _id: "$product", 
         mergedProducts: { $mergeObjects: "$inventory" } 
         } 
        }
    ]).pretty()

    結果:

    {
    	"_id" : "Shorts",
    	"mergedProducts" : {
    		"blue" : 2,
    		"red" : 8,
    		"green" : 5,
    		"black" : 3
    	}
    }
    {
    	"_id" : "Shirt",
    	"mergedProducts" : {
    		"blue" : 10,
    		"red" : 2,
    		"green" : 3,
    		"black" : 1
    	}
    }

    配列

    この例では、$mergeObjectsを適用します ドキュメントの配列を含むフィールドを含む単一のドキュメントに。

    testというコレクションがあるとします。 次のドキュメントを使用:

    {
    	"_id" : 1,
    	"data" : [
    		{
    			"a" : 1,
    			"b" : 2
    		},
    		{
    			"c" : 3,
    			"d" : 4
    		}
    	]
    }

    $mergeObjectsを適用できます dataに フィールド:

    db.test.aggregate(
      [
        {
          $project:
            { 
              result: { $mergeObjects: "$data" }
            }
        }
      ]
    )

    結果:

    { "_id" : 1, "result" : { "a" : 1, "b" : 2, "c" : 3, "d" : 4 } }

    欠落しているフィールド

    $mergeObjects 欠落しているフィールドはすべて無視されます。つまり、存在しないフィールドを指定すると、それは無視されます。フィールドが存在しない場合は、空のドキュメントが返されます。

    例:

    db.users.aggregate(
      [
        {
          $project:
            { 
              user: { $mergeObjects: [ "$name", "$oops" ] }
            }
        }
      ]
    ).pretty()

    結果:

    { "_id" : 1, "user" : { "f_name" : "Homer", "l_name" : "Simpson" } }
    { "_id" : 2, "user" : { "f_name" : "Peter", "l_name" : "Griffin" } }
    { "_id" : 3, "user" : { "f_name" : "Hubert", "l_name" : "Farnsworth" } }
    { "_id" : 4, "user" : { } }

    ただし、なしの場合は次のようになります 存在するフィールドの数:

    db.users.aggregate(
      [
        {
          $project:
            { 
              user: { $mergeObjects: [ "$wrong", "$oops" ] }
            }
        }
      ]
    ).pretty()

    結果:

    { "_id" : 1, "user" : { } }
    { "_id" : 2, "user" : { } }
    { "_id" : 3, "user" : { } }
    { "_id" : 4, "user" : { } }

    結果は空のドキュメントです。

    単一引数の構文を使用する場合も同じです。

    例:

    db.products.aggregate( [
       { $group: { 
         _id: "$product", 
         mergedProducts: { $mergeObjects: "$oops!" } 
         } 
        }
    ]).pretty()

    結果:

    { "_id" : "Shorts", "mergedProducts" : { } }
    { "_id" : "Shirt", "mergedProducts" : { } }

    1. mongodbサーバーに接続しようとしたときにmongoコマンドが認識されない

    2. 時間別のMongoDBグループ

    3. Redisでの範囲クエリ-SpringDataRedis

    4. 結果を制限する前にコレクションをソートするようにMongoにどのように指示しますか?