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" : "example@sqldat.com",
"ph" : null
}
}
$mergeObjectsを使用できます nameをマージします およびcontact フィールド:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
).pretty() 結果:
{
"_id" : 1,
"user" : {
"f_name" : "Homer",
"l_name" : "Simpson",
"email" : "example@sqldat.com",
"ph" : null
}
}
この場合、両方のフィールドをuserという1つのフィールドにマージしました。 。より多くのフィールド/ドキュメントがあれば、必要に応じてそれらもマージできたはずです。
重複するフィールド名
マージするドキュメントに重複するフィールド名が含まれている場合は、$mergeObjects ドキュメントをマージするときにフィールドを上書きします。したがって、結果のドキュメントのフィールドには、そのフィールドに対してマージされた最後のドキュメントの値が含まれます。
次のドキュメントがあるとします。
{
"_id" : 2,
"name" : {
"f_name" : "Peter",
"l_name" : "Griffin"
},
"contact" : {
"email" : "example@sqldat.com",
"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" : "example@sqldat.com"
}
}
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" : { } }