sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $arrayToObject

V MongoDB, $arrayToObject operátor agregačního kanálu převede pole na dokument.

Pole poskytnuté $arrayToObject musí být v jednom ze dvou následujících formátů:

  • Pole dvouprvkových polí, kde první prvek je název pole a druhý prvek je hodnota pole.
  • Pole dokumentů, které obsahují k pole a v pole, kde je k pole obsahuje název pole a v pole obsahuje hodnotu.

Formát 1

Předpokládejme, že máme kolekci nazvanou test s následujícím dokumentem:

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

Můžeme použít $arrayToObject operátor vrátí data pole jako objekt dokumentu:

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

Výsledek:

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

Formát 2

Předpokládejme, že máme dokument jako tento:

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

V tomto případě k pole obsahují klíče a v pole obsahují hodnoty.

Zde je to, co se stane, když použijeme $arrayToObject k tomuto dokumentu:

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

Výsledek:

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

Můžeme vidět, že to vedlo ke stejnému dokumentu, který byl vytvořen v předchozím příkladu.

Nevyhovující pole

Argument poskytnutý $arrayToObject může být jakýkoli platný výraz, pokud se převede na pole dvouprvkových polí nebo pole dokumentů, které obsahuje k a v pole.

Pokud argument toto nevyhovuje, dojde k chybě.

Předpokládejme, že máme následující dokument:

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

Toto pole obsahuje tři prvky.

Zde je to, co se stane, když použijeme $arrayToObject k tomuto dokumentu:

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

Výsledek:

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 uvádí chyba, $arrayToObject requires an array of size 2 arrays .

Zde je další dokument, který obsahuje nevyhovující pole:

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

V tomto případě dokument v poli používá a a b pole namísto k a v .

Zde je to, co se stane, když použijeme $arrayToObject :

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

Výsledek:

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

V tomto případě chyba uvádí, že $arrayToObject requires an object with keys 'k' and 'v' .

Špatný typ

Podobně, pokud argument není ani pole, dojde k chybě.

Předpokládejme, že máme následující dokument:

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

data pole obsahuje řetězec.

Zde je to, co se stane, když použijeme $arrayToObject k tomuto dokumentu:

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

Výsledek:

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 uvádí chyba, $arrayToObject requires an array input .

Nulové hodnoty

Poskytování null výsledkem je null .

Předpokládejme, že máme následující dokument:

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

A použijeme $arrayToObject :

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

Výsledek:

{ "result" : null }

Chybějící pole

Pokud pole chybí, je výsledkem null .

Předpokládejme, že máme následující dokument:

{ "_id" : 7 }

A použijeme $arrayToObject :

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

Výsledek:

{ "result" : null }

Opakující se názvy polí

Podle dokumentace MongoDB, pokud se název pole opakuje v poli:

  • Od verze 4.0.5 $arrayToObject používá poslední hodnotu pro toto pole. U 4.0.0-4.0.4 závisí použitá hodnota na ovladači.
  • Od 3.6.10 $arrayToObject používá poslední hodnotu pro toto pole. U 3.6.0-3.6.9 závisí použitá hodnota na ovladači.
  • Počínaje verzí 3.4.19 $arrayToObject používá poslední hodnotu pro toto pole. U 3.4.0-3.4.19 závisí použitá hodnota na ovladači.

  1. Heslo MongoDB s @

  2. Připojovací řetězec v MongoDB (s příklady)

  3. Úvod do datových struktur Redis:Bitmapy

  4. Server MongoDB není přístupný v místní síti navzdory vazbě IP