简体   繁体   中英

Match by multiple objects in array in Mongoose

My data looks like this

{
    "_id": "62f77d806f24c09f0acae163",
    "name": "Test product",
    "attributes": [
        {
            "attribute_name": "Shape",
            "attribute_value": "Square"
        },
        {
            "attribute_name": "Color",
            "attribute_value": "Red"
        }
    ]
}

I am using the aggregate method to filter results where I want to find products where "attribute_name" is "shape" and the "attribute_value" is "Square" AND "attribute_name" is "Color" and the "attribute_value" is "Red"

Basically I am building a filter feature in my application and basis the data passed to the API I want to get the products.

I have tried this:

let lookup = {
    $match: {
        $and: [
            {
              'attributes.attribute_label': 'Shape', 
              'attributes.attribute_value': {
                $in: ['Square']
              },
            },
            {
              'attributes.attribute_label': 'Color', 
              'attributes.attribute_value': {
                $in: ['Red']
              },
            }
          ],
    }
};


let products = await productsModel.aggregate(lookup); 

At first it seemed like it worked, but then I noticed it doesn't work properly, it matches

'attributes.attribute_value': {
                    $in: ['Red']
                  },

so if it finds "Red" in "attribute_label" which can be anything other than "Color" it will still return the results.

Any help is appreciated

I want to be able to get results based on the values for each attribute name

For eg data passed might be this Shape=Square,Color=Red,Green

I want to get the products which matches this, where the object with attribute_label of Color contains the attribute_value of Red or Green .

Is it a typo? Once you are using "attributes.attribute_label" and once "attributes.attribute_name".

This should work with attributes.attrubite_name (not label!)

[
  {
    '$match': {
      '$and': [
        {
          'attributes.attribute_name': 'Shape'
        }, {
          'attributes.attribute_value': {
            '$in': [
              'Square'
            ]
          }
        }, {
          'attributes.attribute_name': 'Color'
        }, {
          'attributes.attribute_value': {
            '$in': [
              'Red'
            ]
          }
        }
      ]
    }
  }
]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM