MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $mergeObjects

W MongoDB, $mergeObjects Operator potoku agregacji łączy wiele dokumentów w jeden dokument.

Składnia

$mergeObjects operator obsługuje dwie składnie.

Składnia 1:

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

Składnia 2:

{ $mergeObjects: <document> }

Pierwsza składnia akceptuje wiele argumentów, a druga składnia akceptuje jeden argument.

Przykład składni 1 (wiele argumentów)

Pierwsza składnia obejmuje dostarczenie $mergeObjects z więcej niż jednym argumentem/dokumentem. $mergeObjects następnie łączy te dokumenty w jeden.

Załóżmy, że mamy kolekcję o nazwie users z następującym dokumentem:

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

Możemy użyć $mergeObjects scalić name i contact pola:

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

Wynik:

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

W tym przypadku połączyliśmy oba pola w jedno pole o nazwie user . Gdybyśmy mieli więcej pól/dokumentów, moglibyśmy je również połączyć, gdybyśmy chcieli.

Zduplikowane nazwy pól

Jeśli dokumenty, które mają zostać scalone, zawierają zduplikowane nazwy pól, $mergeObjects nadpisuje pole podczas łączenia dokumentów. Dlatego pole w wynikowym dokumencie zawiera wartość z ostatniego dokumentu scalonego dla tego pola.

Załóżmy, że mamy następujący dokument:

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

Widzimy, że oba dokumenty zawierają pole o nazwie f_name .

Oto, co się dzieje, gdy łączymy te dokumenty:

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

Wynik:

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

f_name pole w wynikowym dokumencie zawiera Bart , która jest wartością z ostatniego połączonego dokumentu.

Wartości puste

Jeśli scalasz dokument z null , otrzymany dokument zostanie zwrócony bez zmian.

Ale jeśli wszystkie dokumenty do scalenia są null , zwracany jest pusty dokument.

Załóżmy, że mamy następujące dokumenty:

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

Oto, co się stanie, gdy scalimy name i contact pola w tych dwóch dokumentach:

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

Wynik:

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

Przykłady składni 2 (pojedynczy argument)

Oto dwa przykłady, w których zastosowano składnię jednoargumentową.

$group Akumulator sceniczny

W pierwszym przykładzie $mergeObjects jest używany jako $group akumulator sceniczny.

Załóżmy, że mamy kolekcję o nazwie products z następującymi dokumentami:

{
	"_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
	}
}

Możemy pogrupować te dokumenty według ich product pole, a następnie użyj $mergeObjects scalić inventory pole dla każdej grupy:

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

Wynik:

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

Tablice

Ten przykład dotyczy $mergeObjects do pojedynczego dokumentu, który zawiera pole z tablicą dokumentów.

Załóżmy, że mamy kolekcję o nazwie test z następującymi dokumentami:

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

Możemy zastosować $mergeObjects do data pole:

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

Wynik:

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

Brakujące pola

$mergeObjects ignoruje brakujące pola. Oznacza to, że jeśli podasz pole, które nie istnieje, ignoruje je. Jeśli żadne z pól nie istnieje, zwraca pusty dokument.

Przykład:

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

Wynik:

{ "_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" : { } }

Oto jednak, co się dzieje, gdy brak z pól istnieje:

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

Wynik:

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

Wynikiem jest pusty dokument.

To samo dotyczy składni jednoargumentowej.

Przykład:

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

Wynik:

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kluczowe rzeczy do monitorowania w MongoDB

  2. Wypełnianie mangusty a zagnieżdżanie obiektów

  3. Jak złapać wyjątek podczas tworzenia instancji MongoClient?

  4. tworzyć i aktualizować wiele dokumentów MongoDB w jednym połączeniu

  5. Jaki jest zalecany sposób usuwania indeksów za pomocą Mongoose?