From c9324a815328f0ca9863a5c6911fe86b6fb9e669 Mon Sep 17 00:00:00 2001 From: ravind Date: Mon, 5 Oct 2015 15:32:12 -0400 Subject: [PATCH] DOCS-5882 : Updated table to include aliases, restructured document with new examples, removed unrelated sections --- source/includes/fact-bson-types.rst | 47 ++-- source/reference/bson-types.txt | 2 +- source/reference/operator/query/type.txt | 278 ++++++++++++++++++----- 3 files changed, 250 insertions(+), 77 deletions(-) diff --git a/source/includes/fact-bson-types.rst b/source/includes/fact-bson-types.rst index 8e979c52f56..573b690c475 100644 --- a/source/includes/fact-bson-types.rst +++ b/source/includes/fact-bson-types.rst @@ -1,23 +1,24 @@ -======================= ========== ================== -**Type** **Number** **Notes** ------------------------ ---------- ------------------ -Double 1 -String 2 -Object 3 -Array 4 -Binary data 5 -Undefined 6 Deprecated. -Object id 7 -Boolean 8 -Date 9 -Null 10 -Regular Expression 11 -JavaScript 13 -Symbol 14 -JavaScript (with scope) 15 -32-bit integer 16 -Timestamp 17 -64-bit integer 18 -Min key 255 Query with ``-1``. -Max key 127 -======================= ========== ================== +======================= ========== ====================== ================================== +**Type** **Number** **Alias** **Notes** +----------------------- ---------- ---------------------- ---------------------------------- +Double 1 "double" +String 2 "string" +Object 3 "object" +Array 4 "array" +Binary data 5 "binData" +Undefined 6 "undefined" Deprecated. +Object id 7 "objectId" +Boolean 8 "bool" +Date 9 "date" +Null 10 "null" +Regular Expression 11 "regex" +DBPointer 12 "dbPointer" +JavaScript 13 "javascript" +Symbol 14 "symbol" +JavaScript (with scope) 15 "javascriptWithScope" +32-bit integer 16 "int" +Timestamp 17 "timestamp" +64-bit integer 18 "long" +Min key -1 "minKey" +Max key 127 "maxKey" +======================= ========== ====================== ================================== diff --git a/source/reference/bson-types.txt b/source/reference/bson-types.txt index a102ae11e5e..2c01b39d2fc 100644 --- a/source/reference/bson-types.txt +++ b/source/reference/bson-types.txt @@ -9,7 +9,7 @@ and make remote procedure calls in MongoDB. The BSON specification is located at `bsonspec.org `_. BSON supports the following data types as values in documents. Each data -type has a corresponding number that can be used with the +type has a corresponding number and string alias that can be used with the :query:`$type` operator to query documents by BSON type. .. include:: /includes/fact-bson-types.rst diff --git a/source/reference/operator/query/type.txt b/source/reference/operator/query/type.txt index 0f06fa55879..b0d5be25c80 100644 --- a/source/reference/operator/query/type.txt +++ b/source/reference/operator/query/type.txt @@ -9,109 +9,281 @@ Definition .. query:: $type - *Syntax*: ``{ field: { $type: } }`` + *Syntax*: ``{ field: { $type: | } }`` :query:`$type` selects the documents where the *value* of the ``field`` is an instance of the specified numeric :term:`BSON` - type. This is useful when dealing with highly unstructured data + type or the ``String`` alias. :ref:`document-type-available-types` + describes the BSON types and their corresponding numeric and string aliases. + Querying by data type is useful when dealing with highly unstructured data where data types are not predictable. - .. include:: /includes/warning-mixing-types.rst - Behavior -------- +:query:`$type` returns documents where the BSON type of the ``field`` +matches the BSON type passed to :query:`$type`. + +.. _document-type-available-types: + Available Types ~~~~~~~~~~~~~~~ Refer to the following table for the available :term:`BSON` types -and their corresponding numbers. +with their corresponding numbers and aliases. .. include:: /includes/fact-bson-types.rst -Minimum and Maximum Values +Arrays +~~~~~~ + +When applied to arrays, :query:`$type` matches any **inner** element that is +of the specified :term:`BSON` type. For example, when matching for +``$type : 'array'``, the document will match if the field has a nested array. +It will not return results where the field itself is an ``array``. + +See :ref:`document-querying-by-array-type` for an example. + + +MinKey and MaxKey ~~~~~~~~~~~~~~~~~~~~~~~~~~ -``MinKey`` and ``MaxKey`` compare less than and greater than all -other possible :term:`BSON` element values, respectively, and exist -primarily for internal use. +:bsontype:`MinKey ` and :bsontype:`MaxKey ` +are used in comparison operations and exist primarily for internal use. +For all possible :term:`BSON` element values, ``MinKey`` will always be the +smallest value while ``MaxKey`` will always be the greatest value. -To query if a field value is a ``MinKey``, you must use :query:`$type` with -``-1`` as in the following example: +Querying for ``minKey`` or ``maxKey`` with :query:`$type` +will only return fields that match +the special ``MinKey`` or ``MaxKey`` values. + +Suppose that the ``data`` collection has two documents +with ``MinKey`` and ``MaxKey``: .. code-block:: javascript - db.collection.find( { field: { $type: -1 } } ); + { "_id" : 1, x : { "$minKey" : 1 } } + { "_id" : 2, y : { "$maxKey" : 1 } } + +The following query will return the document with ``_id: 1``: -Arrays -~~~~~~ +.. code-block:: javascript + + db.data.find( { x: { $type: "minKey" } } ) + +The following query will return the document with ``_id: 2``: -When applied to arrays, :query:`$type` matches any **inner** element that is of the -specified type. Without :term:`projection` this means that the entire array -will match if **any** element has the right type. With projection, the -results will include just those -elements of the requested type. +.. code-block:: javascript + + db.data.find( { y: { $type: "maxKey" } } ) Examples -------- +.. _document-querying-by-data-type: + Querying by Data Type ~~~~~~~~~~~~~~~~~~~~~ -Consider the following query: +Given the collection ``addressBook`` containing addresses and zipcodes, where +``zipCode`` has both ``String`` and ``NumberInt`` values: + +.. code-block:: javascript + + { "_id" : 1, address : "2030 Martian Way", zipCode : "90698345" } + { "_id" : 2, address : "156 Lunar Place", zipCode : "43339374" } + { "_id" : 4, address : "55 Saturn Ring" , zipCode : 88602117 } + +The following queries return all documents where ``zipCode`` is the +:term:`BSON` type ``String:`` + .. code-block:: javascript - db.inventory.find( { tags: { $type : 2 } } ); + db.addressBook.find( { zipCode: { $type : 2 } } ); + db.addressBook.find( { zipCode: { $type : 'string' } } ); + +These queries return: -This will list all documents containing a ``tags`` field that is either a string -or an array holding at least one string. If you only want to list documents where -``tags`` is an array, you could use :query:`$where`: +.. code-block:: javascript + + { "_id": 1, address: "2030 Martian Way", zipCode: "90698345" } + { "_id": 2, address: "156 Lunar Place", zipCode: "43339374" } + +.. _document-querying-by-MinKey-And-MaxKey: + +Querying by MinKey and MaxKey +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``restaurants`` collection uses ``minKey`` for any grade that is a +failing grade: + +.. code-block:: javascript + + { + "_id": 1, + "address": { + "building": "230", + "coord": [ -73.996089, 40.675018 ], + "street": "Huntington St", + "zipcode": "11231" + }, + "borough": "Brooklyn", + "cuisine": "Bakery", + "grades": [ + { "date": { "$date": 1393804800000 }, "grade": "C", "score": 15 }, + { "date": { "$date": 1378857600000 }, "grade": "C", "score": 16 }, + { "date": { "$date": 1358985600000 }, "grade": { "$minKey" : 1 }, "score": 30 }, + { "date": { "$date": 1322006400000 }, "grade": "C", "score": 15 } + ], + "name": "Dirty Dan's Donuts", + "restaurant_id": "30075445" + } + +And ``maxKey`` for any grade that is the highest passing grade: + +.. code-block:: javascript + + { + "_id": 2, + "address": { + "building": "1166", + "coord": [ -73.955184, 40.738589 ], + "street": "Manhattan Ave", + "zipcode": "11222" + }, + "borough": "Brooklyn", + "cuisine": "Bakery", + "grades": [ + { "date": { "$date": 1393804800000 }, "grade": { "$maxKey" : 1 }, "score": 2 }, + { "date": { "$date": 1378857600000 }, "grade": "B", "score": 6 }, + { "date": { "$date": 1358985600000 }, "grade": { "$maxKey" : 1 }, "score": 3 }, + { "date": { "$date": 1322006400000 }, "grade": "B", "score": 5 } + ], + "name": "Dainty Daisey's Donuts", + "restaurant_id": "30075449" + } + +The following query returns any restaurant whose ``grades.grade`` field +contains ``minKey``: .. code-block:: javascript - db.inventory.find( { $where : "Array.isArray(this.tags)" } ); + db.restaurant.find( + { 'grades.grade' : { $type : 'minKey' } } + ) + +This returns + +.. code-block:: javascript + + { + "_id": 1, + "address": { + "building": "230", + "coord": [ -73.996089, 40.675018 ], + "street": "Huntington St", + "zipcode": "11231" + }, + "borough": "Brooklyn", + "cuisine": "Bakery", + "grades": [ + { "date": { "$date": 1393804800000 }, "grade": "C", "score": 15 }, + { "date": { "$date": 1378857600000 }, "grade": "C", "score": 16 }, + { "date": { "$date": 1358985600000 }, "grade": { "$minKey" : 1 }, "score": 30 }, + { "date": { "$date": 1322006400000 }, "grade": "C", "score": 15 } + ], + "name": "Dirty Dan's Donuts", + "restaurant_id": "30075445" + } + +The following query returns any restaurant whose ``grades.grade`` field +contains ``maxKey``: -Queries that use :query:`$where` requires a complete collection scan -and uses :ref:`Server-side JavaScript `. -``MinKey`` and ``MaxKey`` -~~~~~~~~~~~~~~~~~~~~~~~~~ +.. code-block:: javascript -The following operation sequence demonstrates both type comparison *and* the -special ``MinKey`` and ``MaxKey`` values: + db.restaurant.find( + { 'grades.grade' : { $type : 'maxKey' } } + ) + +This returns .. code-block:: javascript - > db.test.insert( [ { x : 3 }, - { x : 2.9 }, - { x : new Date() }, - { x : true }, - { x : MaxKey }, - { x : MinKey } ] ); + { + "_id": 2, + "address": { + "building": "1166", + "coord": [ -73.955184, 40.738589 ], + "street": "Manhattan Ave", + "zipcode": "11222" + }, + "borough": "Brooklyn", + "cuisine": "Bakery", + "grades": [ + { "date": { "$date": 1393804800000 }, "grade": { "$maxKey" : 1 }, "score": 2 }, + { "date": { "$date": 1378857600000 }, "grade": "B", "score": 6 }, + { "date": { "$date": 1358985600000 }, "grade": { "$maxKey" : 1 }, "score": 3 }, + { "date": { "$date": 1322006400000 }, "grade": "B", "score": 5 } + ], + "name": "Dainty Daisey's Donuts", + "restaurant_id": "30075449" + } + +.. _document-querying-by-array-type: + +Querying by Array Type +---------------------- - > db.test.find().sort( { x : 1 } ); - { "_id" : ObjectId("4b031563ce8de6586fb002cb"), "x" : { $minKey : 1 } } - { "_id" : ObjectId("4b03155dce8de6586fb002c7"), "x" : 2.9 } - { "_id" : ObjectId("4b03154cce8de6586fb002c6"), "x" : 3 } - { "_id" : ObjectId("4b031566ce8de6586fb002c9"), "x" : true } - { "_id" : ObjectId("4b031563ce8de6586fb002c8"), "x" : ISODate("2012-07-25T23:42:03Z") } - { "_id" : ObjectId("4b031563ce8de6586fb002ca"), "x" : { $maxKey : 1 } } +The SensorReading collection contains the following documents: -Minimum Shard Key -~~~~~~~~~~~~~~~~~ +.. code-block:: javascript -To query for the minimum value of a :term:`shard key` of a -:term:`sharded cluster`, use the following operation when -connected to the :program:`mongos`: + { + "_id": 1, + "readings": [ + 25, + 23, + [ "Warn: High Temp!", 55 ], + [ "ERROR: SYSTEM SHUTDOWN!", 66 ] + ] + }, + { + "_id": 2, + "readings": [ + 25, + 25, + 24, + 23 + ] + } + +The following query returns any document where ``readings`` has an element of +:term:`BSON` type ``array``: .. code-block:: javascript - use config - db.chunks.find( { "min.shardKey": { $type: -1 } } ) + db.SensorReading.find( "readings" : { $type: "array" } ) + +This returns + +.. code-block:: javascript + + { + "_id": 1, + "readings": [ + 25, + 23, + [ "Warn: High Temp!", 55 ], + [ "ERROR: SYSTEM SHUTDOWN!", 66 ] + ] + } + +Since the ``readings`` field has at least one array as an element, +the :query:`$type` will return the first document. Additional Information ---------------------- -:method:`~db.collection.find()`, :method:`~db.collection.insert()`, -:query:`$where`, :term:`BSON`, :term:`shard key`, :term:`sharded cluster` . +:method:`~db.collection.find()`, :doc:`BSON Types `.