English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
لقد قمنا بإدراج المستندات التالية في المجموعة users، كما يلي–
db.users.insert( { "address": { "city": "Los Angeles" "state": "California" "pincode": "123" }, "tags": [ "music", "cricket", "blogs" ], "name": "Tom Benzamin" } )
يحتوي المستند المذكور أعلاه على مستند فرعي address ومصفوفة علامات.
افترض أننا نريد البحث عن مستندات المستخدمين بناءً على العلامات. لذلك، سنقوم بإنشاء فهرس على مصفوفة tags في المجموعة.
عند إنشاء فهرس على مصفوفة، يتم إنشاء فهرس لكل حقل في المصفوفة بشكل منفصل. لذا، في مثالنا، عند إنشاء فهرس على مصفوفة tags، سيتم إنشاء فهرس لكل قيمة في المصفوفة music، cricket و blogs بشكل منفصل.
لإنشاء فهرس على مصفوفة علامات tags، استخدم الكود التالي-
>db.users.createIndex({"tags":1}) { "createdCollectionAutomatically": false, "numIndexesBefore": 2, "numIndexesAfter": 3, "ok" : 1 } >
بعد إنشاء الفهرس، يمكننا البحث في حقل tags في المجموعة، مثلما يلي-
>db.users.find({tags:"cricket"}).pretty(){ "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" }, "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" } >
للتحقق من استخدامك للفهرس الصحيح، استخدم الأمر explain التالي-
>db.users.find({tags:"cricket"}).explain()
هذا يعطيك النتائج التالية-
{ "queryPlanner": { "plannerVersion": 1, "namespace": "mydb.users", "indexFilterSet": false, "parsedQuery": { "tags": { "$eq": "cricket" } }, "queryHash": "9D3B61A7", "planCacheKey" : "04C9997B" "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "tags" : 1 }, "indexName" : "tags_1", "isMultiKey" : false, "multiKeyPaths" : { "tags" : [], }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "tags" : [ "[\"cricket\", \"cricket\"]" ] } } }, "rejectedPlans" : [], }, "serverInfo" : { "host" : "Krishna", "port" : 27017, "version" : "4.2.1", "gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e" }, "ok" : 1 } >
上面的命令产生了“ cursor”:“ BtreeCursor tags_1”,它确认使用了正确的索引。
假设我们要根据city,state 和 pincode 字段搜索文档。由于所有这些字段都是地址子文档字段的一部分,因此我们将在子文档的所有字段上创建索引。
要在子文档的所有三个字段上创建索引,请使用以下代码-
>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1}) { "numIndexesBefore" : 4, "numIndexesAfter" : 4, "note" : "all indexes already exist", "ok" : 1 } >
创建索引后,我们可以使用此索引搜索任何子文档字段,如下所示:
> db.users.find({"address.city":"Los Angeles"}).pretty(){ "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" }, "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" }
تذكر أن تعبير الاستعلام يجب أن يتبع ترتيب المؤشر المحدد. لذلك، سيدعم المؤشر الذي تم إنشاؤه التحقق من التالي -
تذكر أن تعبير الاستعلام يجب أن يتبع ترتيب المؤشر المحدد. لذلك، سيدعم المؤشر الذي تم إنشاؤه التحقق من التالي - "_id" : ObjectId("5dd7c927f1dd4583e7103fdf"), "address" : { "city" : "Los Angeles", "state" : "California", "pincode" : "123" }, "tags" : [ "music", "cricket", "blogs" ], "name" : "Tom Benzamin" } >