TBE
TBE

Reputation: 1133

How to get all sub-documents with a certain value of a certain field?

I have the following simplified collection: (consider all street_names are quoted)

{
    city_id: 1,
    city_name: "city1",
    streets: [
                {
                 street_id: 1,
                 street_name: street1 
                },
                {
                 street_id: 2,
                 street_name: street2 
                },
                {
                 street_id: 3,
                 street_name: street3 
                },
                {
                 street_id: 4,
                 street_name: street4
                },
                {
                 street_id: 5,
                 street_name: street5
                }
            ]
},
{
    city_id: 2,
    city_name: "city2",
    streets: [
                {
                 street_id: 1,
                 street_name: street1 
                },
                {
                 street_id: 2,
                 street_name: street2 
                },
                {
                 street_id: 3,
                 street_name: street3 
                },
                {
                 street_id: 4,
                 street_name: street4
                },
                {
                 street_id: 5,
                 street_name: street5
                },
                {
                 street_id: 6,
                 street_name: street6
                },
                {
                 street_id: 7,
                 street_name: street7
                }

            ]
}

Is there a way to query the collection in a way that will return only sub-documents that match a certain name regexp? For example: Get all sub-documents with street_name that contains " " (3 spaces) in them.

Upvotes: 0

Views: 55

Answers (1)

profesor79
profesor79

Reputation: 9473

The procedure when using aggregation framework will look like:

  1. $match documents - this step can be ommited as we need execute match again after unwind - but limiting working set is a good idea

{$match:{"streets.street_name":"/REGEX_EXPRESSION_HERE/"}}

  1. take out data from array

{$unwind:"$streets"}

  1. $match documents

{$match:{"streets.street_name":"/REGEX_EXPRESSION_HERE/"}}

  1. display only what is needed

{$project: {_id:0, "street_id": "$streets.street_id", street_name":"$streets.street_name", city_id:1 }}

--before edit

You can use regex in filter expression

db.collection.find({"streets.street_name":"/REGEX_EXPRESSION_HERE/"})

Upvotes: 1

Related Questions