V MongoDB, $mergeObjects
operátor agregačního kanálu spojuje více dokumentů do jednoho dokumentu.
Syntaxe
$mergeObjects
operátor podporuje dvě syntaxe.
Syntaxe 1:
{ $mergeObjects: [ <document1>, <document2>, ... ] }
Syntaxe 2:
{ $mergeObjects: <document> }
První syntaxe přijímá více argumentů a druhá syntaxe přijímá jeden argument.
Příklad syntaxe 1 (více argumentů)
První syntaxe zahrnuje poskytnutí $mergeObjects
s více než jedním argumentem/dokumentem. $mergeObjects
pak tyto dokumenty spojí do jednoho.
Předpokládejme, že máme kolekci nazvanou users
s následujícím dokumentem:
{ "_id" : 1, "name" : { "f_name" : "Homer", "l_name" : "Simpson" }, "contact" : { "email" : "[email protected]", "ph" : null } }
Můžeme použít $mergeObjects
sloučit name
a contact
pole:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
).pretty()
Výsledek:
{ "_id" : 1, "user" : { "f_name" : "Homer", "l_name" : "Simpson", "email" : "[email protected]", "ph" : null } }
V tomto případě jsme obě pole sloučili do jednoho pole s názvem user
. Kdybychom měli více polí/dokumentů, mohli bychom je také sloučit, kdybychom chtěli.
Duplicitní názvy polí
Pokud dokumenty, které mají být sloučeny, obsahují duplicitní názvy polí, $mergeObjects
přepíše pole při slučování dokumentů. Pole ve výsledném dokumentu tedy obsahuje hodnotu z posledního dokumentu sloučeného pro toto pole.
Předpokládejme, že máme následující dokument:
{ "_id" : 2, "name" : { "f_name" : "Peter", "l_name" : "Griffin" }, "contact" : { "email" : "[email protected]", "f_name" : "Bart" } }
Vidíme, že oba dokumenty obsahují pole s názvem f_name
.
Když tyto dokumenty sloučíme, stane se toto:
db.users.aggregate(
[
{ $match: { _id: 2 } },
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
).pretty()
Výsledek:
{ "_id" : 2, "user" : { "f_name" : "Bart", "l_name" : "Griffin", "email" : "[email protected]" } }
f_name
pole ve výsledném dokumentu obsahuje Bart
, což je hodnota z posledního dokumentu, který byl sloučen.
Nulové hodnoty
Při slučování dokumentu pomocí null
, bude výsledný dokument vrácen bez jakýchkoli změn.
Ale pokud jsou všechny dokumenty ke sloučení null
, pak se vrátí prázdný dokument.
Předpokládejme, že máme následující dokumenty:
{ "_id" : 3, "name" : { "f_name" : "Hubert", "l_name" : "Farnsworth" }, "contact" : null } { "_id" : 4, "name" : null, "contact" : null }
Zde je to, co se stane, když sloučíme name
a contact
pole v těchto dvou dokumentech:
db.users.aggregate(
[
{ $match: { _id: { $in: [ 3, 4 ] } } },
{
$project:
{
user: { $mergeObjects: [ "$name", "$contact" ] }
}
}
]
)
Výsledek:
{ "_id" : 3, "user" : { "f_name" : "Hubert", "l_name" : "Farnsworth" } } { "_id" : 4, "user" : { } }
Příklady syntaxe 2 (jediný argument)
Zde jsou dva příklady, které používají syntaxi jediného argumentu.
$group
Jevištní akumulátor
V prvním příkladu $mergeObjects
se používá jako $group
jevištní akumulátor.
Předpokládejme, že máme kolekci nazvanou products
s následujícími dokumenty:
{ "_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 } }
Tyto dokumenty můžeme seskupit podle jejich product
a poté použijte $mergeObjects
sloučit inventory
pole pro každou skupinu:
db.products.aggregate( [
{ $group: {
_id: "$product",
mergedProducts: { $mergeObjects: "$inventory" }
}
}
]).pretty()
Výsledek:
{ "_id" : "Shorts", "mergedProducts" : { "blue" : 2, "red" : 8, "green" : 5, "black" : 3 } } { "_id" : "Shirt", "mergedProducts" : { "blue" : 10, "red" : 2, "green" : 3, "black" : 1 } }
Pole
Tento příklad platí $mergeObjects
na jeden dokument, který obsahuje pole s polem dokumentů.
Předpokládejme, že máme kolekci nazvanou test
s následujícími dokumenty:
{ "_id" : 1, "data" : [ { "a" : 1, "b" : 2 }, { "c" : 3, "d" : 4 } ] }
Můžeme použít $mergeObjects
na data
pole:
db.test.aggregate(
[
{
$project:
{
result: { $mergeObjects: "$data" }
}
}
]
)
Výsledek:
{ "_id" : 1, "result" : { "a" : 1, "b" : 2, "c" : 3, "d" : 4 } }
Chybějící pole
$mergeObjects
ignoruje všechna chybějící pole. To znamená, že pokud zadáte pole, které neexistuje, bude je ignorovat. Pokud žádné z polí neexistuje, vrátí prázdný dokument.
Příklad:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$name", "$oops" ] }
}
}
]
).pretty()
Výsledek:
{ "_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" : { } }
Co se však stane, když žádné z polí existují:
db.users.aggregate(
[
{
$project:
{
user: { $mergeObjects: [ "$wrong", "$oops" ] }
}
}
]
).pretty()
Výsledek:
{ "_id" : 1, "user" : { } } { "_id" : 2, "user" : { } } { "_id" : 3, "user" : { } } { "_id" : 4, "user" : { } }
Výsledkem je prázdný dokument.
Je to stejné při použití syntaxe jednoho argumentu.
Příklad:
db.products.aggregate( [
{ $group: {
_id: "$product",
mergedProducts: { $mergeObjects: "$oops!" }
}
}
]).pretty()
Výsledek:
{ "_id" : "Shorts", "mergedProducts" : { } } { "_id" : "Shirt", "mergedProducts" : { } }