diff --git a/source/includes/indexes/multikey.rb b/source/includes/indexes/multikey.rb new file mode 100644 index 00000000..4c4b08fa --- /dev/null +++ b/source/includes/indexes/multikey.rb @@ -0,0 +1,37 @@ +require 'mongo' + +# Replace the placeholders with your credentials +uri = "" + +# Sets the server_api field of the options object to Stable API version 1 +options = { server_api: { version: "1" }} + +# Creates a new client and connect to the server +client = Mongo::Client.new(uri, options) + +# start-sample-data +database = client.use('sample_mflix') +collection = database[:movies] +# end-sample-data + +# Creates an index on the "cast" field +# start-index-multikey +collection.indexes.create_one({ cast: 1 }) +# end-index-multikey + +# Finds a document with the specified cast members by using the newly created index +# start-index-multikey-query +filter = { cast: { '$all' => ['Aamir Khan', 'Kajol'] } } +doc = collection.find(filter).first + +if doc + puts doc.to_json +else + puts "No document found" +end +# end-index-multikey-query + +# Lists all indexes on the collection +# start-check-multikey-index +puts collection.indexes.collect(&:to_json) +# end-check-multikey-index diff --git a/source/indexes.txt b/source/indexes.txt index a6f0ef95..0c03d5f4 100644 --- a/source/indexes.txt +++ b/source/indexes.txt @@ -21,10 +21,10 @@ Optimize Queries by Using Indexes .. toctree:: :titlesonly: :maxdepth: 1 - + Single Field Compound -.. Multikey + Multikey .. Atlas Search Overview diff --git a/source/indexes/multikey-index.txt b/source/indexes/multikey-index.txt new file mode 100644 index 00000000..f394b520 --- /dev/null +++ b/source/indexes/multikey-index.txt @@ -0,0 +1,123 @@ +.. _ruby-multikey-index: + +================ +Multikey Indexes +================ + +.. contents:: On this page + :local: + :backlinks: none + :depth: 2 + :class: singlecol + +.. facet:: + :name: genre + :values: reference + +.. meta:: + :keywords: index, query, optimization, efficiency + +Overview +-------- + +**Multikey indexes** are indexes that improve the performance of queries +on array-valued fields. You can create a multikey index on a collection +by using the ``create_one`` method and the same syntax that you use to create +a :ref:`single field index `. + + +When creating a multikey index, you must specify the following details: + +- The fields on which to create the index + +- The sort order for each field (ascending or descending) + +Sample Data +~~~~~~~~~~~ + +The examples in this guide use the ``movies`` collection in the +``sample_mflix`` database from the :atlas:`Atlas sample datasets +`. To access this collection from your {+language+} +application, create a ``Mongo::Client`` object that connects to +an Atlas cluster and assign the following values to your ``database`` +and ``collection`` variables: + +.. literalinclude:: /includes/indexes/single-field.rb + :start-after: start-sample-data + :end-before: end-sample-data + :language: ruby + :copyable: + +To learn how to create a free MongoDB Atlas cluster and +load the sample datasets, see the :atlas:`Get Started with Atlas +` guide. + +Create a Multikey Index +----------------------- + +Use the ``create_one`` method to create a multikey index. The following example +creates an index in ascending order on the ``cast`` field: + +.. literalinclude:: /includes/indexes/multikey.rb + :start-after: start-index-multikey + :end-before: end-index-multikey + :language: ruby + :copyable: + +Verify Index Creation +--------------------- + +You can verify that the index was created by listing the indexes in the +collection. You should see an index for ``cast`` in the list, as shown +in the following output: + +.. io-code-block:: + :copyable: true + + .. input:: /includes/indexes/multikey.rb + :start-after: start-check-multikey-index + :end-before: end-check-multikey-index + :language: ruby + + .. output:: + :visible: true + + {"v": 2, "key": {"cast": 1}, "name": "cast_1"} + +Example Query +------------- + +The following is an example of a query that is covered by the index +created on the ``cast`` field: + +.. io-code-block:: + :copyable: true + + .. input:: /includes/indexes/multikey.rb + :start-after: start-index-multikey-query + :end-before: end-index-multikey-query + :language: ruby + + .. output:: + :visible: false + + {"_id":...,"title":"Fanaa",...,"cast": ["Aamir Khan", "Kajol", "Rishi Kapoor", "Tabu"],...} + +Additional Information +---------------------- + +To view runnable examples that demonstrate how to manage indexes, see +:ref:`ruby-indexes`. + +To learn more about multikey indexes, see :manual:`Multikey +Indexes ` in the {+mdb-server+} manual. + +API Documentation +~~~~~~~~~~~~~~~~~ + +To learn more about any of the methods discussed in this guide, see the +following API documentation: + +- `indexes <{+api-root+}/Mongo/Collection.html#indexes-instance_method>`__ +- `create_one <{+api-root+}/Mongo/Index/View.html>`__ +- `find <{+api-root+}/Mongo/Collection.html#find-instance_method>`__