alexanoid
alexanoid

Reputation: 25770

Spring Data MongoDB get document by inner object

In my Spring Boot / Spring Data MongoDB project I have a following POJO:

@Document(collection = "decision_analysis")
public class DecisionAnalysis {

    private String id;

    private DecisionAnalysisRequest decisionAnalysisRequest;

    private DecisionMatrixPageResponse decisionMatrixPage;

    private Date createDate;

    private HttpRequestData httpRequestData;

...

}

where DecisionAnalysisRequest:

public class DecisionAnalysisRequest implements Serializable {

    private static final long serialVersionUID = 1493180175756424789L;

    private String decisionNameFilterPattern;

    private Set<BaseQuery> filterQueries;

    private Set<Long> sortCriteriaIds;

    private String sortWeightCriteriaDirection;

    private String sortTotalVotesCriteriaDirection;

    private Map<String, Double> sortCriteriaCoefficients;

    private Long sortCharacteristicId;

...

}

I need to lookup DecisionAnalysis documents by DecisionAnalysisRequest so I have created a Spring Data MongoDB repository with the following method:

@Repository
public interface DecisionAnalysisRepository extends MongoRepository<DecisionAnalysis, String> {

    DecisionAnalysis findByDecisionAnalysisRequest(DecisionAnalysisRequest decisionAnalysisRequest);

}

Right now this method only work when filterQueries is null. But when filterQueries is not null the method continuously returns no results.

filterQueries is an array of composite objects, for example:

 "filterQueries":[
      {
         "type":"AnyInQuery",
         "characteristicId":711903,
         "characteristicName":"Body type",
         "value":[
            "Compact"
         ],
         "operator":"OR"
      },
      {
         "type":"RangeQuery",
         "characteristicId":712745,
         "characteristicName":"Sensor photo detectors (megapixels)",
         "value":[
            10,
            53
         ]
      }
   ]

What am I doing wrong and how do I adjust my code in order to properly look up DecisionAnalysis documents by DecisionAnalysisRequest even when the filterQueries contains data.

UPDATE

This is a sample DecisionAnalysisRequest document that I'm going to use as a key(information inside of this document varies each time per user selected on UI):

{
   "sortCriteriaIds":[
      711882,
      711887,
      711884,
      711899,
      711896,
      711897,
      711890,
      711891,
      711888,
      711889,
      711895,
      711892,
      711893
   ],
   "sortCriteriaCoefficients":{

   },
   "pageNumber":0,
   "pageSize":10,
   "sortWeightCriteriaDirection":"DESC",
   "sortid":null,
   "sortCharacteristicDirection":null,
   "sortDecisionPropertyName":null,
   "sortDecisionPropertyDirection":null,
   "decisionsIds":[

   ],
   "persistent":true,
   "includeChildids":null,
   "excludeChildids":null,
   "filterQueries":[
      {
         "type":"AnyInQuery",
         "characteristicId":711913,
         "characteristicName":"Body material",
         "value":[
            "Aluminium alloy",
            "Brass",
            "Carbon fiber"
         ],
         "operator":"OR"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":711903,
         "characteristicName":"Body type",
         "value":[
            "Compact SLR",
            "Compact"
         ],
         "operator":"OR"
      },
      {
         "type":"EqualQuery",
         "characteristicId":712746,
         "characteristicName":"Sensor size",
         "value":"1/1.7\" (7.44 x 5.58 mm)"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":712895,
         "characteristicName":"Color space",
         "value":[
            "Adobe RGB",
            "ECI RGB",
            "Primary color space"
         ],
         "operator":"OR"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":712145,
         "characteristicName":"Other resolutions",
         "value":[
            "1008 x 672",
            "1024 x 1024",
            "1024 x 576"
         ],
         "operator":"OR"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":712738,
         "characteristicName":"Image ratio w:h",
         "value":[
            "1:1",
            "3:2",
            "4:3"
         ],
         "operator":"OR"
      },
      {
         "type":"RangeQuery",
         "characteristicId":712744,
         "characteristicName":"Effective pixels (megapixels)",
         "value":[
            9,
            44
         ]
      },
      {
         "type":"EqualQuery",
         "characteristicId":712901,
         "characteristicName":"Color filter array",
         "value":"RGB color filter array"
      },
      {
         "type":"EqualQuery",
         "characteristicId":712921,
         "characteristicName":"Image stabilization",
         "value":"Sensor-shift"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":712944,
         "characteristicName":"Uncompressed format",
         "value":[
            "No",
            "RAW",
            "TIFF"
         ],
         "operator":"OR"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":712928,
         "characteristicName":"Image parameters",
         "value":[
            "Brightness",
            "Color",
            "Color Space",
            "Color Tone",
            "Contrast"
         ],
         "operator":"OR"
      },
      {
         "type":"RangeQuery",
         "characteristicId":712919,
         "characteristicName":"White balance presets",
         "value":[
            2,
            10
         ]
      },
      {
         "type":"RangeQuery",
         "characteristicId":712917,
         "characteristicName":"Boosted ISO (minimum)",
         "value":[
            1762,
            10741
         ]
      },
      {
         "type":"AnyInQuery",
         "characteristicId":712950,
         "characteristicName":"File format",
         "value":[
            "3FR",
            "AGIF",
            "ARW"
         ],
         "operator":"OR"
      },
      {
         "type":"RangeQuery",
         "characteristicId":712918,
         "characteristicName":"Boosted ISO (maximum)",
         "value":[
            339298,
            2878034
         ]
      },
      {
         "type":"RangeQuery",
         "characteristicId":713340,
         "characteristicName":"Normal focus range (cm)",
         "value":[
            22,
            131
         ]
      },
      {
         "type":"EqualQuery",
         "characteristicId":713343,
         "characteristicName":"Lens mount",
         "value":"Leica M"
      },
      {
         "type":"AnyInQuery",
         "characteristicId":713325,
         "characteristicName":"Autofocus",
         "value":[
            "Center",
            "Continuous",
            "Contrast Detect (sensor)",
            "Face Detection",
            "Live View"
         ],
         "operator":"OR"
      },
      {
         "type":"RangeQuery",
         "characteristicId":713341,
         "characteristicName":"Macro focus range (cm)",
         "value":[
            19,
            75
         ]
      },
      {
         "type":"RangeQuery",
         "characteristicId":713342,
         "characteristicName":"Number of focus points",
         "value":[
            78,
            468
         ]
      },
      {
         "type":"RangeQuery",
         "characteristicId":713388,
         "characteristicName":"Viewfinder resolution (dots)",
         "value":[
            633548,
            3722581
         ]
      },
      {
         "type":"RangeQuery",
         "characteristicId":713386,
         "characteristicName":"Viewfinder coverage %",
         "value":[
            84,
            97
         ]
      }
   ]
}

Upvotes: 0

Views: 2315

Answers (1)

s7vr
s7vr

Reputation: 75914

The query is run on server side, so you have to look into performance from server stand point of view.

You'll hit the 16MB memory limit for document continuous data growth.

You've to use dot notation to reach to filterQueries embedded doc for comparison.

Below example if you like to match one of the filters.

@Query("{decisionAnalysisRequest.filterQueries :?0}")
DecisionAnalysis findByDecisionAnalysisRequest(BasicQuery filter);

The reason you dont get the response as your comparing the input DecisionAnalysisRequest against the database DecisionAnalysisRequestwhich has more filterQueries.

You should look into comparing criteria on the fields on the document/embedded document/embedded array oppose to compare the whole document/embedded document/embedded array.

Upvotes: 1

Related Questions