A. L
A. L

Reputation: 12639

How to filter a nested/lower subdocument

Say if I have a result like this:

    {
        "_id" : ObjectId("5b722d06c23b5f2bd0329a41"),
        "name" : "test",
        "item" : {
            "_id" : ObjectId("5b722d07c23b5f2bd0329a53"),
            "display_name" : "",
            "image" : "http://via.placeholder.com/700x500/ffffff/000000/?text=No%20Image&",
            "is_private" : true,
            "details" : [
                {
                    "is_private" : false,
                    "type" : "text",
                    "_id" : ObjectId("5b722d06c23b5f2bd0329a44"),
                    "title" : "Name",
                    "content" : "",
                    "order" : 0
                },
                {
                    "is_private" : false,
                    "type" : "text",
                    "_id" : ObjectId("5b722d06c23b5f2bd0329a43"),
                    "title" : "Price",
                    "content" : "",
                    "order" : 1
                },
                {
                    "is_private" : false,
                    "type" : "text",
                    "_id" : ObjectId("5b722d06c23b5f2bd0329a42"),
                    "title" : "Company",
                    "content" : "",
                    "order" : 2
                }
            ],
            "tags" : [ ],
            "__v" : 0
        }
    }

and I want to filter by item.details.is_private, how should I do this? I want to return all properties of item but filter out any item.details.is_private if it is true

I am currently projecting it as:

{
    "$project": {
        name: 1,
        item: 1
    }
}

but am not sure how to implement $filter in this setting

Upvotes: 1

Views: 62

Answers (1)

Ashh
Ashh

Reputation: 46441

You can try using $addsFields with $filter aggregation

db.collection.aggregate([
  { "$addFields": {
    "item.details": {
      "$filter": {
        "input": "$item.details",
        "as": "detail",
        "cond": {
          "$eq": [ "$$detail.is_private", true ]
        }
      }
    }
  }}
])

Upvotes: 1

Related Questions