sql >> Database >  >> NoSQL >> MongoDB

MongoDB $arrayToObject

In MongoDB is de $arrayToObject aggregatiepijplijnoperator converteert een array naar een document.

De array geleverd aan $arrayToObject moet een van de twee volgende formaten hebben:

  • Een array van arrays met twee elementen waarbij het eerste element de veldnaam is en het tweede element de veldwaarde.
  • Een array van documenten die een k . bevatten veld en een v veld, waar de k veld bevat de veldnaam en de v veld bevat de waarde.

Formaat 1

Stel dat we een verzameling hebben met de naam test met het volgende document:

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

We kunnen de $arrayToObject . gebruiken operator om de data te retourneren veld als documentobject:

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

Resultaat:

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

Formaat 2

Stel dat we een document hebben zoals dit:

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

In dit geval is de k velden bevatten de sleutels en de v velden bevatten de waarden.

Dit is wat er gebeurt als we $arrayToObject toepassen naar dat document:

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

Resultaat:

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

We kunnen zien dat dit resulteerde in hetzelfde document als in het vorige voorbeeld.

Niet-conforme arrays

Het argument gegeven aan $arrayToObject kan elke geldige uitdrukking zijn zolang deze wordt omgezet in een array van arrays van twee elementen of een array van documenten die k bevat en v velden.

Als het argument hier niet aan voldoet, treedt er een fout op.

Stel dat we het volgende document hebben:

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

Deze array bevat drie elementen.

Dit is wat er gebeurt als we $arrayToObject toepassen naar dat document:

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

Resultaat:

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

Zoals de fout aangeeft, vereist $arrayToObject requires an array of size 2 arrays .

Hier is nog een document dat een niet-conforme array bevat:

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

In dit geval gebruikt het document in de array a en b velden in plaats van k en v .

Dit is wat er gebeurt als we $arrayToObject toepassen :

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

Resultaat:

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

In dit geval geeft de fout aan dat $arrayToObject requires an object with keys 'k' and 'v' .

Verkeerd type

Evenzo, als het argument niet eens een array is, treedt er een fout op.

Stel dat we het volgende document hebben:

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

De data veld bevat een tekenreeks.

Dit is wat er gebeurt als we $arrayToObject toepassen naar dat document:

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

Resultaat:

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

Zoals de fout aangeeft, vereist $arrayToObject requires an array input .

Null-waarden

null opgeven resulteert in null .

Stel dat we het volgende document hebben:

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

En we passen $arrayToObject . toe :

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

Resultaat:

{ "result" : null }

Ontbrekende velden

Als het veld ontbreekt, is het resultaat null .

Stel dat we het volgende document hebben:

{ "_id" : 7 }

En we passen $arrayToObject . toe :

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

Resultaat:

{ "result" : null }

Veldnamen herhalen

Volgens de MongoDB-documentatie, als de naam van een veld in de array wordt herhaald:

  • Vanaf 4.0.5, $arrayToObject gebruikt de laatste waarde voor dat veld. Voor 4.0.0-4.0.4 hangt de gebruikte waarde af van het stuurprogramma.
  • Vanaf 3.6.10, $arrayToObject gebruikt de laatste waarde voor dat veld. Voor 3.6.0-3.6.9 hangt de gebruikte waarde af van het stuurprogramma.
  • Vanaf 3.4.19, $arrayToObject gebruikt de laatste waarde voor dat veld. Voor 3.4.0-3.4.19 hangt de gebruikte waarde af van het stuurprogramma.

  1. Hoe Spring-sessies configureren om met Redis in xml te werken?

  2. Biedt Mongoose toegang tot eerdere waarde van onroerend goed in pre('save')?

  3. .NET Core singleton-service injecteren in een andere singleton-service

  4. Mongoose subdocument zoeken/bijwerken