MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ arrayToObject

Trong MongoDB, $arrayToObject nhà điều hành đường ống tổng hợp chuyển đổi một mảng thành một tài liệu.

Mảng được cung cấp cho $arrayToObject phải ở một trong hai định dạng sau:

  • Một mảng gồm các mảng hai phần tử trong đó phần tử đầu tiên là tên trường và phần tử thứ hai là giá trị trường.
  • Một mảng tài liệu chứa k và một trường v trường, trong đó k trường chứa tên trường và v trường chứa giá trị.

Định dạng 1

Giả sử chúng ta có một bộ sưu tập được gọi là test với tài liệu sau:

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

Chúng ta có thể sử dụng $arrayToObject toán tử để trả về data trường như một đối tượng tài liệu:

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

Kết quả:

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

Định dạng 2

Giả sử chúng ta có một tài liệu như sau:

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

Trong trường hợp này, k các trường chứa các khóa và v các trường chứa các giá trị.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject vào tài liệu đó:

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

Kết quả:

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

Chúng ta có thể thấy rằng điều này dẫn đến cùng một tài liệu đã được tạo trong ví dụ trước.

Mảng không phù hợp

Đối số được cung cấp cho $arrayToObject có thể là bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một mảng gồm mảng hai phần tử hoặc mảng tài liệu có chứa kv các lĩnh vực.

Nếu đối số không tuân theo điều này, thì sẽ xảy ra lỗi.

Giả sử chúng ta có tài liệu sau:

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

Mảng này chứa ba phần tử.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject vào tài liệu đó:

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

Kết quả:

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

Khi lỗi nêu rõ, $arrayToObject requires an array of size 2 arrays .

Đây là một tài liệu khác có chứa một mảng không phù hợp:

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

Trong trường hợp này, tài liệu trong mảng sử dụng ab các trường thay vì kv .

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject :

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

Kết quả:

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

Trong trường hợp này, lỗi nói rằng $arrayToObject requires an object with keys 'k' and 'v' .

Loại sai

Tương tự, nếu đối số không phải là một mảng, thì sẽ xảy ra lỗi.

Giả sử chúng ta có tài liệu sau:

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

Dữ liệu data trường chứa một chuỗi.

Đây là những gì sẽ xảy ra khi chúng tôi áp dụng $arrayToObject vào tài liệu đó:

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

Kết quả:

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

Khi lỗi nêu rõ, $arrayToObject requires an array input .

Giá trị rỗng

Cung cấp null kết quả là null .

Giả sử chúng ta có tài liệu sau:

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

Và chúng tôi áp dụng $arrayToObject :

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

Kết quả:

{ "result" : null }

Các trường bị thiếu

Nếu trường bị thiếu, kết quả là null .

Giả sử chúng ta có tài liệu sau:

{ "_id" : 7 }

Và chúng tôi áp dụng $arrayToObject :

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

Kết quả:

{ "result" : null }

Tên trường lặp lại

Theo tài liệu MongoDB, nếu tên của một trường lặp lại trong mảng:

  • Bắt đầu trong 4.0.5, $arrayToObject sử dụng giá trị cuối cùng cho trường đó. Đối với 4.0.0-4.0.4, giá trị được sử dụng tùy thuộc vào trình điều khiển.
  • Bắt đầu từ 3,6.10, $arrayToObject sử dụng giá trị cuối cùng cho trường đó. Đối với 3.6.0-3.6.9, giá trị được sử dụng tùy thuộc vào trình điều khiển.
  • Bắt đầu từ 3.4.19, $arrayToObject sử dụng giá trị cuối cùng cho trường đó. Đối với 3.4.0-3.4.19, giá trị sử dụng tùy thuộc vào trình điều khiển.

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để MongoDB tránh được mớ hỗn độn về SQL injection?

  2. Ngoại lệ:không thể chuyển đổi từ loại BSON EOO thành Date

  3. Handlebars:Quyền truy cập đã bị từ chối để giải quyết thuộc tính từ vì nó không phải là tài sản riêng của cha mẹ của nó

  4. Tạo trường autoincrement duy nhất với mongoose

  5. Tìm kiếm mongodb dữ liệu mùa xuân cho ngày ISO