Difference between revisions of "MongoDB QueryData"

From mi-linux
Jump to navigationJump to search
 
(79 intermediate revisions by the same user not shown)
Line 3: Line 3:
 
== Querying a collection ==
 
== Querying a collection ==
  
Show all data so far:
+
The find() function can be used to query the documents.
db.deptCollection.find()
 
  
The data comes back messy. The pretty() function can be used to improve the layout::
+
The format is:
  
  db.deptCollection.find().pretty()
+
<pre style="color: purple">
 +
  db.collectionName.find(optional_query_criteria)
 +
</pre>
  
The find() function can be used to find just one document.
+
Where the query_criteria follows a pattern:
  
The format is:
+
<pre style="color: purple">
<pre style="color: blue">
+
  db.collectionName.find({keyField: "value"})
  db.collectionName.find({"fieldName": "value"})
 
 
</pre>
 
</pre>
  
The fieldName must be in quotes, the value needs quotes if it is a string or date value.
+
Note:
 +
* the criteria is enclosed in curly brackets: {}
 +
* the value needs quotes if it is a string or date value
 +
* all names and values are case sensitive
 +
* quotes are optional for the fieldName, so long as they do not contain spaces
  
For example, find department 10:
 
  
db.deptCollection.find({"deptno":10}).pretty()
+
=== Find all documents ===
  
Finding an employee means using the array name too:
+
For example, show all the data so far in the ''dept'' collection:
  db.deptCollection.find({"employees.empno":7902}).pretty()
+
  db.dept.find()
  
However, this does mean you get back all the employees in the department they were found in!
+
The results should look like:
  
Since version 2.2 MongoDB's new $elemMatch can avoid this:
+
<pre style="color: blue">
 +
{ "_id" : 10, "deptno" : 10, "dname" : "ACCOUNTING", "loc" : "NEW YORK" }
 +
{ "_id" : 20, "deptno" : 20, "dname" : "RESEARCH", "loc" : "DALLAS" }
 +
{ "_id" : 40, "deptno" : 40, "dname" : "OPERATIONS", "loc" : "BOSTON" }
 +
{ "_id" : 50, "deptno" : 40, "dname" : "OPERATIONS V2", "loc" : "BOSTON" }
 +
{ "_id" : 30, "deptno" : 30, "dname" : "SALES", "loc" : "CHICAGO" }
  
  db.deptCollection.find({"deptno":20}, 
+
</pre>
  { _id: 0, employees: {$elemMatch: {empno: 7902}}}).pretty()
+
 
 +
To show the documents in the ''emp'' collection:
 +
 
 +
  db.emp.find()
  
$elemMatch limits the contents of the employees array to contain only the first element matching the $elemMatch condition.
 
  
_id is a unique value automatically generated by MongoDB (like a Primary Key). To see it:
+
The data comes back messy. The pretty() function can be used to improve the layout:
  
  db.deptCollection.find({"deptno":20}, 
+
  db.emp.find().pretty()
  { employees: {$elemMatch: {empno: 7902}}}).pretty()
 
  
This is akin to a SQL query:
+
A subset of the ''emp'' collection is shown below:
  
 
<pre style="color: blue">
 
<pre style="color: blue">
SELECT * FROM Emp WHERE deptno=20 AND empno = 7902
+
> db.emp.find().pretty()
 +
{
 +
        "_id" : ObjectId("5a09e79ac536e890d5a7a666"),
 +
        "empno" : 7782,
 +
        "ename" : "CLARK",
 +
        "job" : "MANAGER",
 +
        "mgr" : 7839,
 +
        "hiredate" : ISODate("1989-06-09T00:00:00Z"),
 +
        "sal" : 2450,
 +
        "deptno" : 10
 +
}
 +
{
 +
        "_id" : ObjectId("5a09e79ac536e890d5a7a667"),
 +
        "empno" : 7839,
 +
        "ename" : "KING",
 +
        "job" : "PRESIDENT",
 +
        "hiredate" : ISODate("1980-11-17T00:00:00Z"),
 +
        "sal" : 5000,
 +
        "deptno" : 10
 +
}
 +
....
 +
 
 
</pre>
 
</pre>
  
However, could you just query using the empno?
+
Note the object ids are now system generated (and will be different values in your own data).
 +
 
 +
=== Find with query criteria ===
 +
 
 +
 
 +
If working with a large collection, you will not want all the documents returned.
 +
 
 +
Find all the employees are are clerks:
 +
 
 +
  db.emp.find({job:"CLERK"})
 +
 
 +
For numerical data, the greater than (>) and less than (<) operators are represented by ''$gt'' and ''$lt'' respectively. Note, for these operators, the search criteria must be enclosed in {} brackets.
 +
 
 +
Find all employees who earn more than 2400:
 +
db.emp.find({sal: {$gt:2400}})
 +
 
 +
Find all employees whose commission is less than 1000:
 +
db.emp.find({comm: {$lt:1000}})
 +
 
 +
Working with the date field (hiredate) is more complex, since you have to create a new date for the comparison.
 +
 
 +
For example, find all employees who start after the 1st January 2000:
 +
db.emp.find({hiredate: {$lt: new Date("2000-01-01")}})
 +
 
 +
Find employees who started on the 16th October 2015:
 +
db.emp.find({hiredate: new Date("2015-10-16")})
 +
 
 +
=== Find One document ===
 +
 
 +
To find just one document requires the use of the equivalent of a primary key field. This can be a field that the user takes responsibility to keep unique, such as the ''deptno'':
 +
 
 +
db.dept.find({deptno:10})
 +
 
 +
 
 +
Or the object id can be used, which will be unique:
 +
 
 +
db.dept.find({_id:10})
 +
 
 +
 
 +
In the ''emp'' collection, the _ids are system generated and generally along the lines of: '5a0727e99ba81dee9b1cc6a3', so less easy to use!
 +
 
 +
List all the records in emp:
 +
 
 +
db.emp.find().pretty()
 +
 
 +
and pick an _id from the collection and then try and find one record.
 +
 
 +
For example (note, your object id will be different):
 +
 
 +
db.emp.find( {_id : ObjectId("5a0727e99ba81dee9b1cc6a3")}).pretty()
 +
 
 +
 
 +
The function ''ObjectId()'' must be used to convert the value into an object id.
  
 
== Next Step ==
 
== Next Step ==
  
[[MongoDB_Update|Updating]] the collection
+
[[MongoDB_Aggregate_Pipeline|MongoDB Aggregation]] Pipeline

Latest revision as of 14:13, 5 March 2018

Main Page >> MongoDB >>MongoDB Workbook >> Querying Collections

Querying a collection

The find() function can be used to query the documents.

The format is:

 db.collectionName.find(optional_query_criteria)

Where the query_criteria follows a pattern:

 db.collectionName.find({keyField: "value"})

Note:

  • the criteria is enclosed in curly brackets: {}
  • the value needs quotes if it is a string or date value
  • all names and values are case sensitive
  • quotes are optional for the fieldName, so long as they do not contain spaces


Find all documents

For example, show all the data so far in the dept collection:

db.dept.find()

The results should look like:

{ "_id" : 10, "deptno" : 10, "dname" : "ACCOUNTING", "loc" : "NEW YORK" }
{ "_id" : 20, "deptno" : 20, "dname" : "RESEARCH", "loc" : "DALLAS" }
{ "_id" : 40, "deptno" : 40, "dname" : "OPERATIONS", "loc" : "BOSTON" }
{ "_id" : 50, "deptno" : 40, "dname" : "OPERATIONS V2", "loc" : "BOSTON" }
{ "_id" : 30, "deptno" : 30, "dname" : "SALES", "loc" : "CHICAGO" }

To show the documents in the emp collection:

db.emp.find()


The data comes back messy. The pretty() function can be used to improve the layout:

db.emp.find().pretty()

A subset of the emp collection is shown below:

> db.emp.find().pretty()
{
        "_id" : ObjectId("5a09e79ac536e890d5a7a666"),
        "empno" : 7782,
        "ename" : "CLARK",
        "job" : "MANAGER",
        "mgr" : 7839,
        "hiredate" : ISODate("1989-06-09T00:00:00Z"),
        "sal" : 2450,
        "deptno" : 10
}
{
        "_id" : ObjectId("5a09e79ac536e890d5a7a667"),
        "empno" : 7839,
        "ename" : "KING",
        "job" : "PRESIDENT",
        "hiredate" : ISODate("1980-11-17T00:00:00Z"),
        "sal" : 5000,
        "deptno" : 10
}
....

Note the object ids are now system generated (and will be different values in your own data).

Find with query criteria

If working with a large collection, you will not want all the documents returned.

Find all the employees are are clerks:

 db.emp.find({job:"CLERK"})

For numerical data, the greater than (>) and less than (<) operators are represented by $gt and $lt respectively. Note, for these operators, the search criteria must be enclosed in {} brackets.

Find all employees who earn more than 2400:

db.emp.find({sal: {$gt:2400}})

Find all employees whose commission is less than 1000:

db.emp.find({comm: {$lt:1000}})

Working with the date field (hiredate) is more complex, since you have to create a new date for the comparison.

For example, find all employees who start after the 1st January 2000:

db.emp.find({hiredate: {$lt: new Date("2000-01-01")}})

Find employees who started on the 16th October 2015:

db.emp.find({hiredate: new Date("2015-10-16")})

Find One document

To find just one document requires the use of the equivalent of a primary key field. This can be a field that the user takes responsibility to keep unique, such as the deptno:

db.dept.find({deptno:10})


Or the object id can be used, which will be unique:

db.dept.find({_id:10})


In the emp collection, the _ids are system generated and generally along the lines of: '5a0727e99ba81dee9b1cc6a3', so less easy to use!

List all the records in emp:

db.emp.find().pretty()

and pick an _id from the collection and then try and find one record.

For example (note, your object id will be different):

db.emp.find( {_id : ObjectId("5a0727e99ba81dee9b1cc6a3")}).pretty()


The function ObjectId() must be used to convert the value into an object id.

Next Step

MongoDB Aggregation Pipeline