MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $objectToArray

Dans MongoDB, le $objectToArray L'opérateur de pipeline d'agrégation convertit un document en tableau.

Le tableau produit par $objectToArray contient un élément pour chaque paire champ/valeur du document d'origine. Chaque élément est un document qui contient un k champ et un v champ :

  • Le k champ contient le nom du champ dans le document d'origine.
  • Le v champ contient la valeur du champ dans le document d'origine.

Exemple

Supposons que nous ayons une collection appelée dogs avec le document suivant :

{
	"_id" : 1,
	"name" : "Fetch",
	"specs" : {
		"height" : 400,
		"weight" : 55,
		"color" : "brown"
	}
}

Nous pouvons utiliser le $objectToArray opérateur pour renvoyer les specs champ sous forme de tableau :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
).pretty()

Résultat :

{
	"result" : [
		{
			"k" : "height",
			"v" : 400
		},
		{
			"k" : "weight",
			"v" : 55
		},
		{
			"k" : "color",
			"v" : "brown"
		}
	]
}

Documents imbriqués

Le $objectToArray L'opérateur s'applique uniquement au champ de niveau supérieur. Il ne s'applique pas de manière récursive aux documents intégrés.

Supposons que nous ayons un document comme celui-ci :

{
	"_id" : 2,
	"name" : "Wag",
	"specs" : {
		"height" : 50,
		"weight" : 5,
		"color" : {
			"eyes" : "brown",
			"coat" : "black"
		}
	}
}

Voici ce qui se passe lorsque nous appliquons $objectToArray à ce document :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 2 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
).pretty()

Résultat :

{
	"result" : [
		{
			"k" : "height",
			"v" : 50
		},
		{
			"k" : "weight",
			"v" : 5
		},
		{
			"k" : "color",
			"v" : {
				"eyes" : "brown",
				"coat" : "black"
			}
		}
	]
}

Dans ce cas, le document de niveau supérieur est converti en k /v format, mais le document intégré reste le même que dans le document d'origine.

Mauvais type

L'argument fourni à $objectToArray peut être n'importe quelle expression valide tant qu'elle se résout en un objet document.

Si l'argument ne se résout pas en un objet document, une erreur se produit.

Supposons que nous ayons le document suivant :

{ "_id" : 3, "name" : "Fetch", "specs" : "None" }

Les specs le champ contient une chaîne.

Voici ce qui se passe lorsque nous appliquons $objectToArray à ce document :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 3 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
)

Résultat :

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$objectToArray requires a document input, found: string",
	"code" : 40390,
	"codeName" : "Location40390"
} : 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

Comme l'indique l'erreur, $objectToArray requires a document input .

Valeurs nulles

Fournir null donne null .

Supposons que nous ayons le document suivant :

{ "_id" : 4, "name" : "Fetch", "specs" : null }

Et nous appliquons $objectToArray :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 4 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
)

Résultat :

{ "result" : null }

Champs manquants

Si le champ est manquant, le résultat est null .

Supposons que nous ayons le document suivant :

{ "_id" : 5, "name" : "Fetch" }

Et nous appliquons $objectToArray :

db.dogs.aggregate(
   [
     { $match: { _id: { $in: [ 5 ] } } },
     { $project: { 
        _id: 0,
        result: { $objectToArray: "$specs" } } 
         }
   ]
)

Résultat :

{ "result" : null }