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

Bao gồm các trường cụ thể trong chỉ mục ký tự đại diện trong MongoDB

Khi bạn tạo chỉ mục ký tự đại diện trong MongoDB, bạn có tùy chọn chỉ định một trường, tất cả các trường hoặc chỉ một số trường.

Bạn có thể sử dụng wildcardProjection để bao gồm hoặc loại trừ các đường dẫn trường cụ thể khỏi chỉ mục ký tự đại diện. Bài viết này trình bày một ví dụ về việc đưa các trường cụ thể vào chỉ mục ký tự đại diện.

Tài liệu Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là pets với các tài liệu sau:

{
	"_id" : 1,
	"name" : "Wag",
	"details" : {
		"type" : "Dog",
		"weight" : 20,
		"awards" : {
			"Florida Dog Awards" : "Top Dog",
			"New York Marathon" : "Fastest Dog",
			"Sumo 2020" : "Biggest Dog"
		}
	}
}
{
	"_id" : 2,
	"name" : "Fetch",
	"details" : {
		"born" : ISODate("2020-06-22T14:00:00Z"),
		"color" : "Black"
	}
}
{
	"_id" : 3,
	"name" : "Scratch",
	"details" : {
		"eats" : [
			"Mouse Porridge",
			"Bird Soup",
			"Caviar"
		],
		"type" : "Cat",
		"born" : ISODate("2020-12-19T14:00:00Z")
	}
}

Chúng tôi có thể tạo chỉ mục ký tự đại diện trên toàn bộ tập hợp, nhưng chỉ bao gồm các trường chúng tôi muốn.

Tạo chỉ mục

Đây là một ví dụ:

db.pets.createIndex(
  { "$**" : 1 },
  {
    "wildcardProjection" : {
      "details.type" : 1,
      "details.born" : 1
    }
  }
)

Đầu ra:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

{ "$**" : 1 } một phần là thứ tạo ra chỉ mục ký tự đại diện và wildcardProjection part là phần chỉ định những trường nào sẽ bao gồm. Trong trường hợp này, chúng tôi đã bao gồm details.type và trường details.born đồng ruộng. Cung cấp cho chúng giá trị 1 đưa chúng vào chỉ mục một cách rõ ràng.

Xem chỉ mục

Chúng tôi có thể xem các chỉ mục trên bộ sưu tập bằng cách gọi getIndexes() phương pháp:

db.pets.getIndexes()

Kết quả:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"$**" : 1
		},
		"name" : "$**_1",
		"wildcardProjection" : {
			"details.type" : 1,
			"details.born" : 1
		}
	}
]

Chúng ta có thể thấy rằng có hai chỉ mục.

  • Chỉ mục đầu tiên nằm trên _id đồng ruộng. Điều này được tạo khi bộ sưu tập được tạo (MongoDB tạo một chỉ mục duy nhất trên trường _id trong quá trình tạo bộ sưu tập).
  • Chỉ mục thứ hai là chỉ mục ký tự đại diện của chúng tôi. Chúng ta có thể thấy rằng nó được tự động đặt tên là $**_1 và nó bao gồm các trường mà chúng tôi đã chỉ định.

Kiểm tra chỉ mục

Chúng tôi cũng có thể chạy một số truy vấn để xem liệu chỉ mục của chúng tôi có được sử dụng hay không.

Về lý thuyết, truy vấn sau nên sử dụng chỉ mục:

db.pets.find( { "details.type" : "Dog" } )

Để kiểm tra điều này, chúng tôi có thể thêm explain() phương pháp để xem kế hoạch truy vấn:

db.pets.find( { "details.type" : "Dog" } ).explain()

Kết quả:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHotel.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"details.type" : {
				"$eq" : "Dog"
			}
		},
		"queryHash" : "F1C5286F",
		"planCacheKey" : "5326DE93",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"$_path" : 1,
					"details.type" : 1
				},
				"indexName" : "$**_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"$_path" : [ ],
					"details.type" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"$_path" : [
						"[\"details.type\", \"details.type\"]"
					],
					"details.type" : [
						"[\"Dog\", \"Dog\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Chúng tôi có thể thấy rằng nó đã sử dụng quét chỉ mục (IXSCAN) trên chỉ mục của chúng tôi.

Ngược lại với điều này, đây là điều sẽ xảy ra khi chúng tôi chạy truy vấn trên một trường không bao gồm trong chỉ mục:

db.pets.find( { "details.awards.New York Marathon" : "Fastest Dog" } ).explain()

Kết quả:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHotel.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"details.awards.New York Marathon" : {
				"$eq" : "Fastest Dog"
			}
		},
		"queryHash" : "EC0D5185",
		"planCacheKey" : "EC0D5185",
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"details.awards.New York Marathon" : {
					"$eq" : "Fastest Dog"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Trong trường hợp này, nó đã quét bộ sưu tập (COLLSCAN), vì vậy, như mong đợi, nó không sử dụng chỉ mục.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lấy một giá trị từ MongoDB theo tên khóa của nó

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

  3. Giao dịch trong MongoDB

  4. $ addFields khi không tìm thấy $ phù hợp

  5. Meteor:tải tệp từ máy khách lên bộ sưu tập Mongo so với hệ thống tệp và GridFS