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

MongoDB $arrayToObject

W MongoDB $arrayToObject Operator potoku agregacji konwertuje tablicę na dokument.

Tablica dostarczona do $arrayToObject musi być w jednym z dwóch następujących formatów:

  • Tablica dwuelementowych tablic, w której pierwszy element to nazwa pola, a drugi element to wartość pola.
  • Tabela dokumentów zawierających k pole i v pole, gdzie k pole zawiera nazwę pola i v pole zawiera wartość.

Format 1

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

{
	"_id" : 1,
	"data" : [
		[
			"name",
			"Fetch"
		],
		[
			"type",
			"Dog"
		]
	]
}

Możemy użyć $arrayToObject operator do zwrócenia data pole jako obiekt dokumentu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

{ "result" : { "name" : "Fetch", "type" : "Dog" } }

Format 2

Załóżmy, że mamy taki dokument:

{
	"_id" : 2,
	"data" : [
		{
			"k" : "name",
			"v" : "Fetch"
		},
		{
			"k" : "type",
			"v" : "Dog"
		}
	]
}

W tym przypadku k pola zawierają klucze i v pola zawierają wartości.

Oto, co się dzieje, gdy zastosujemy $arrayToObject do tego dokumentu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 2 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

{ "result" : { "name" : "Fetch", "type" : "Dog" } }

Widzimy, że w wyniku tego powstał ten sam dokument, który został wyprodukowany w poprzednim przykładzie.

Niezgodne tablice

Argument dostarczony do $arrayToObject może być dowolnym poprawnym wyrażeniem, pod warunkiem, że zostanie rozwiązany jako tablica dwuelementowych tablic lub tablica dokumentów zawierająca k i v pola.

Jeśli argument nie jest zgodny z tym, pojawia się błąd.

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

{ "_id" : 3, "data" : [ [ "name", "Fetch", "Dog" ] ] }

Ta tablica zawiera trzy elementy.

Oto, co się dzieje, gdy zastosujemy $arrayToObject do tego dokumentu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 3 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$arrayToObject requires an array of size 2 arrays,found array of size: 3",
	"code" : 40397,
	"codeName" : "Location40397"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Jak stwierdza błąd, $arrayToObject requires an array of size 2 arrays .

Oto kolejny dokument zawierający niezgodną tablicę:

{ "_id" : 4, "data" : [ { "a" : "name", "b" : "Fetch" } ] }

W tym przypadku dokument w tablicy używa a i b pola zamiast k i v .

Oto, co się dzieje, gdy zastosujemy $arrayToObject :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$arrayToObject requires an object with keys 'k' and 'v'. Missing either or both keys from: {a: \"name\", b: \"Fetch\"}",
	"code" : 40393,
	"codeName" : "Location40393"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

W tym przypadku błąd stwierdza, że ​​$arrayToObject requires an object with keys 'k' and 'v' .

Niewłaściwy typ

Podobnie, jeśli argument nie jest nawet tablicą, pojawia się błąd.

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

{ "_id" : 5, "data" : "None" }

data pole zawiera ciąg.

Oto, co się dzieje, gdy zastosujemy $arrayToObject do tego dokumentu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$arrayToObject requires an array input, found: string",
	"code" : 40386,
	"codeName" : "Location40386"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Jak stwierdza błąd, $arrayToObject requires an array input .

Wartości puste

Podanie null wyniki w null .

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

{ "_id" : 6, "data" : null }

I stosujemy $arrayToObject :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

{ "result" : null }

Brakujące pola

Jeśli brakuje pola, wynikiem jest null .

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

{ "_id" : 7 }

I stosujemy $arrayToObject :

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     { $project: { 
        _id: 0,
        result: { $arrayToObject: "$data" } } 
         }
   ]
)

Wynik:

{ "result" : null }

Powtarzające się nazwy pól

Zgodnie z dokumentacją MongoDB, jeśli nazwa pola powtarza się w tablicy:

  • Począwszy od 4.0.5, $arrayToObject używa ostatniej wartości dla tego pola. W przypadku wersji 4.0.0-4.0.4 użyta wartość zależy od sterownika.
  • Od wersji 3.6.10, $arrayToObject używa ostatniej wartości dla tego pola. W przypadku wersji 3.6.0-3.6.9 użyta wartość zależy od sterownika.
  • Od wersji 3.4.19, $arrayToObject używa ostatniej wartości tego pola. W przypadku wersji 3.4.0-3.4.19 użyta wartość zależy od sterownika.

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregat Mongodb (liczba) na wielu polach jednocześnie

  2. MongoDB C# Query Array of Objects, która zawiera wartość właściwości

  3. Uzyskanie najwyższej wartości kolumny w MongoDB

  4. BŁĄD:Nie można zapisać pliku pid do /var/run/mongodb/mongod.pid:Brak takiego pliku lub katalogu w fedorze 20

  5. Jak usunąć dokumenty MongoDB, importując plik?