MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $arrayToObject

В MongoDB, $arrayToObject Операторът на конвейера за агрегиране преобразува масив в документ.

Масивът, предоставен на $arrayToObject трябва да бъде в един от следните два формата:

  • Масив от масиви от два елемента, където първият елемент е името на полето, а вторият елемент е стойността на полето.
  • Масив от документи, които съдържат k поле и v поле, където k полето съдържа името на полето и v полето съдържа стойността.

Формат 1

Да предположим, че имаме колекция, наречена test със следния документ:

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

Можем да използваме $arrayToObject оператор за връщане на data поле като обект на документ:

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

Резултат:

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

Формат 2

Да предположим, че имаме документ като този:

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

В този случай k полетата съдържат ключовете и v полетата съдържат стойностите.

Ето какво се случва, когато приложим $arrayToObject към този документ:

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

Резултат:

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

Можем да видим, че това доведе до същия документ, който беше създаден в предишния пример.

Несъответстващи масиви

Аргументът, предоставен на $arrayToObject може да бъде всеки валиден израз, стига да се разрешава до масив от двуелементни масиви или масив от документи, който съдържа k и v полета.

Ако аргументът не отговаря на това, възниква грешка.

Да предположим, че имаме следния документ:

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

Този масив съдържа три елемента.

Ето какво се случва, когато приложим $arrayToObject към този документ:

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

Резултат:

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

Както гласи грешката, $arrayToObject requires an array of size 2 arrays .

Ето още един документ, който съдържа несъответстващ масив:

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

В този случай документът в масива използва a и b полета вместо k и v .

Ето какво се случва, когато приложим $arrayToObject :

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

Резултат:

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

В този случай грешката гласи, че $arrayToObject requires an object with keys 'k' and 'v' .

Грешен тип

По същия начин, ако аргументът дори не е масив, възниква грешка.

Да предположим, че имаме следния документ:

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

data полето съдържа низ.

Ето какво се случва, когато приложим $arrayToObject към този документ:

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

Резултат:

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

Както гласи грешката, $arrayToObject requires an array input .

Нулеви стойности

Предоставяне на null води до null .

Да предположим, че имаме следния документ:

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

И ние прилагаме $arrayToObject :

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

Резултат:

{ "result" : null }

Липсващи полета

Ако полето липсва, резултатът е null .

Да предположим, че имаме следния документ:

{ "_id" : 7 }

И ние прилагаме $arrayToObject :

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

Резултат:

{ "result" : null }

Повтарящи се имена на полета

Според документацията на MongoDB, ако името на поле се повтаря в масива:

  • Започвайки от 4.0.5, $arrayToObject използва последната стойност за това поле. За 4.0.0-4.0.4 използваната стойност зависи от драйвера.
  • Започвайки от 3.6.10, $arrayToObject използва последната стойност за това поле. За 3.6.0-3.6.9 използваната стойност зависи от драйвера.
  • Започвайки от 3.4.19, $arrayToObject използва последната стойност за това поле. За 3.4.0-3.4.19 използваната стойност зависи от драйвера.

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Съвпадение на поле на масив, което съдържа произволна комбинация от предоставения масив в MongoDB

  2. Създавайте, четете, актуализирайте, изтривайте данни с помощта на Node.js - Mongoose

  3. objasni() в Mongodb:разлики между nscanned и nscannedObjects

  4. Ръководство за внедряване и поддръжка на MongoDB с помощта на Puppet:Част 1

  5. MongoDB $filter