MongoDB: db.collection.distinct() method
db.collection.dataSize
The db.collection.distinct() method is used to find the distinct values for a specified field across a single collection and returns the results in an array.
Syntax:
db.collection.distinct(field, query)
Parameters:
| Name | Description | Required / Optional |
Type |
|---|---|---|---|
| field | The field for which to return distinct values. | Required | string |
| query | A query that specifies the documents from which to retrieve the distinct values. | Required | document |
Sample document in the restaurants collection:
{
"address": {
"building": "1007",
"coord": [ -73.856077, 40.848447 ],
"street": "Morris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Morris Park Bake Shop",
"restaurant_id": "30075445"
}
............
Example: Return Distinct Values for a Field
The following example returns the distinct values for the field cuisine from all documents in the restaurants collection:
db.restaurants.distinct( "cuisine" );
Output:
The method returns the following array of distinct cuisine values:
[
"Irish",
"Bakery",
"American ",
"Hamburgers",
"Jewish/Kosher",
"Delicatessen",
"Ice Cream, Gelato, Yogurt, Ices",
"Chinese",
"Other",
"Chicken",
"Turkish",
"Caribbean",
"Donuts",
"Sandwiches/Salads/Mixed Buffet",
"Bagels/Pretzels",
"Pizza",
"Italian",
"Steak",
"Continental",
"Latin (Cuban, Dominican, Puerto Rican, South & Central American)",
"Polish",
"German",
"French",
"Pizza/Italian",
"Mexican",
"Spanish",
"Café/Coffee/Tea",
"Tex-Mex",
"Pancakes/Waffles",
"Soul Food",
"Seafood",
"Hotdogs",
"Greek",
"Not Listed/Not Applicable",
"African",
"Japanese",
"Indian",
"Armenian",
"Thai",
"Chinese/Cuban",
"Mediterranean",
"Korean",
"Bottled beverages, including water, sodas, juices, etc.",
"Russian",
"Eastern European",
"Middle Eastern",
"Asian",
"Ethiopian",
"Vegetarian",
"Barbecue",
"Egyptian",
"English",
"Sandwiches",
"Portuguese",
"Indonesian",
"Chinese/Japanese",
"Filipino",
"Juice, Smoothies, Fruit Salads",
"Brazilian",
"Afghan",
"Vietnamese/Cambodian/Malaysia",
"Café/Coffee/Tea",
"Soups & Sandwiches",
"Tapas",
"Moroccan",
"Pakistani",
"Peruvian",
"Bangladeshi",
"Czech",
"Salads",
"Creole",
"Fruits/Vegetables",
"Iranian",
"Cajun",
"Scandinavian",
"Polynesian",
"Soups",
"Australian",
"Hotdogs/Pretzels",
"Southwestern",
"Nuts/Confectionary",
"Hawaiian",
"Creole/Cajun",
"Californian",
"Chilean"
]
Example: Return Distinct Values for an Embedded Field
The following example returns the distinct values for the field zipcode, embedded in the address field, from all documents in the restaurants collection:
db.restaurants.distinct( "address.zipcode" );
Output:
The method returns the following array of distinct zipcode values:
[
"10019",
"10462",
"11224",
"11225",
"11374",
"11369",
"11219",
"11234",
"10460",
"11226",
"11214",
"11208",
"10065",
"11223",
"11414",
"11218",
"11004",
"11209",
"11215",
"10021",
"11356",
"10314",
"10003",
"11106",
"10024",
"10025",
"10012",
"10005",
"11368",
"11203",
"11205",
"10466",
"10007",
"11201",
"10018",
"10474",
"10174",
"11418",
"11379",
"10016",
"10022",
"11236",
"11385",
"11212",
"10023",
"11230",
"11371",
"10306",
"10458",
"10308",
"10038",
"11211",
"10028",
"10017",
"10465",
"10014",
"11222",
"10013",
"11101",
"10009",
"10305",
"11235",
"10011",
"11363",
"11232",
"11103",
"10309",
"10032",
"11228",
"10036",
"10033",
"10451",
"11372",
"11366",
"11204",
"10312",
"10001",
"10467",
"11435",
"11432",
"11001",
"10302",
"11229",
"11694",
"11420",
"11697",
"11367",
"10463",
"11375",
"10006",
"10452",
"11427",
"10475",
"11373",
"10310",
"10304",
"11238",
"10010",
"11105",
"11377",
"10034",
"11360",
"11415",
"11416",
"10470",
"11354",
"10301",
"10002",
"11361",
"11358",
"11213",
"10128",
"10464",
"10004",
"11239",
"11104",
"11231",
"10075",
"11364",
"11237",
"11249",
"11362",
"11357",
"10303",
"11434",
"10472",
"11220",
"11378",
"10461",
"11417",
"10027",
"11365",
"11413",
"10029",
"10459",
"11421",
"10468",
"11217",
"11216",
"10456",
"11423",
"11207",
"11355",
"10469",
"11206",
"10455",
"10454",
"11210",
"10119",
"10020",
"10453",
"11412",
"11419",
"11429",
"11370",
"10040",
"11430",
"11221",
"11422",
"11428",
"11040",
"11693",
"11411",
"10031",
"11691",
"10457",
"11102",
"10037",
"10106",
"10030",
"10471",
"10112",
"11426",
"10039",
"10035",
"11005",
"10307",
"11692",
"10044",
"10026",
"10280",
"11233",
"10103",
"10121",
"10282",
"10473",
"10281",
"11436",
"10153",
"11433",
"10057",
"11242",
"10111",
"10122",
"10168",
"10107",
"10000",
"11109",
"10171",
"11256",
"10069",
"10311",
"11010",
"11451",
"07005",
"10317",
"10104",
"",
"10048",
"10123",
"11352",
"10165",
"10167"
]
Example: Specify Query with distinct
The following example returns the distinct values for the field zipcode, embedded in the address field, from the documents whose cuisine is equal to "Delicatessen":
db.restaurants.distinct( "address.zipcode" , { "cuisine" : "Delicatessen" } );
Output:
The method returns the following array of distinct zipcode values:
[
"11234",
"11209",
"11356",
"10003",
"11106",
"10314",
"11385",
"10306",
"10308",
"10021",
"10022",
"10006",
"10475",
"10007",
"10017",
"10019",
"11101",
"11215",
"10018",
"10036",
"11365",
"10001",
"10025",
"11426",
"11228",
"11360",
"10012",
"11357",
"11370",
"10016",
"10028",
"10309",
"11694",
"10310",
"11377",
"10013",
"10463",
"11375",
"10002",
"11363",
"11217",
"11361",
"10004",
"10282",
"11364",
"10038",
"11105",
"10464",
"11378",
"10458",
"11222",
"11220",
"10065",
"11232",
"11415",
"11242",
"11354",
"11103",
"10023",
"10451",
"10014",
"11208",
"10112",
"11417",
"10032",
"11430",
"11432",
"10024",
"10020",
"11238",
"10005",
"10011",
"11369",
"10467",
"11230",
"11231",
"10455",
"10010",
"11379",
"11201",
"11355",
"11219",
"11368",
"10033",
"11214",
"11102",
"10027",
"10301",
"10280",
"11434",
"11372",
"10469",
"11206",
"10029",
"11435",
"10461",
"10468",
"10474",
"11423",
"10075",
"11416",
"10462",
"10302",
"11236",
"10312",
"11414",
"11223",
"10035",
"11374",
"11367",
"10128",
"11422",
"10465",
"11237",
"11418",
"10453",
"11207"
]
Retrieve the restaurants data from here
Behavior
Array Fields
If the value of the specified field is an array, db.collection.distinct() considers each element of the array as a separate value.
For instance, if a field has as its value [ 1, [1], 1 ], then db.collection.distinct() considers 1, [1], and 1 as separate values.
Index Use
When possible, db.collection.distinct() operations can use indexes.
Indexes can also cover db.collection.distinct() operations.
Previous:
db.collection.dataSize() method
Next:
db.collection.drop() method
