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

MongoDB $objectToArray

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

Pole vytvořené $objectToArray obsahuje prvek pro každý pár pole/hodnota v původním dokumentu. Každý prvek je dokument, který obsahuje k pole a v pole:

  • k pole obsahuje název pole v původním dokumentu.
  • v pole obsahuje hodnotu pole v původním dokumentu.

Příklad

Předpokládejme, že máme sbírku nazvanou dogs s následujícím dokumentem:

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

Můžeme použít $objectToArray operátor vrátí specs pole jako pole:

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

Výsledek:

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

Vnořené dokumenty

$objectToArray operátor se vztahuje pouze na pole nejvyšší úrovně. Nevztahuje se rekurzivně na žádné vložené dokumenty.

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

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

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

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

Výsledek:

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

V tomto případě je dokument nejvyšší úrovně převeden na k /v formát, ale vložený dokument zůstane stejný jako v původním dokumentu.

Nesprávný typ

Argument poskytnutý $objectToArray může být jakýkoli platný výraz, pokud se překládá na objekt dokumentu.

Pokud se argument nevyřeší na objekt dokumentu, dojde k chybě.

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

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

specs pole obsahuje řetězec.

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

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

Výsledek:

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

Jak uvádí chyba, $objectToArray requires a document input .

Nulové hodnoty

Poskytování null výsledkem je null .

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

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

A použijeme $objectToArray :

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

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" : 5, "name" : "Fetch" }

A použijeme $objectToArray :

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

Výsledek:

{ "result" : null }


  1. Je možné získat jeden souhrnný výsledek?

  2. Řídítka:Přístup k vyřešení vlastnosti byl odepřen, protože to není vlastní vlastnost jejího nadřazeného prvku

  3. Nastavení Redis na Webfaction

  4. Vyberte délku řetězce v mongodb