Java Spring数据MongoDB按内部对象获取文档
在我的Spring Boot/Spring Data MongoDB项目中,我有以下POJO:Java Spring数据MongoDB按内部对象获取文档,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,在我的Spring Boot/Spring Data MongoDB项目中,我有以下POJO: @Document(collection = "decision_analysis") public class DecisionAnalysis { private String id; private DecisionAnalysisRequest decisionAnalysisRequest; private DecisionMatrixPageResponse
@Document(collection = "decision_analysis")
public class DecisionAnalysis {
private String id;
private DecisionAnalysisRequest decisionAnalysisRequest;
private DecisionMatrixPageResponse decisionMatrixPage;
private Date createDate;
private HttpRequestData httpRequestData;
...
}
如果决策分析请求:
目前,此方法仅在filterQueries为null时有效。但是当filterQueries不为null时,该方法将连续不返回任何结果
filterQueries是复合对象的数组,例如:
"filterQueries":[
{
"type":"AnyInQuery",
"characteristicId":711903,
"characteristicName":"Body type",
"value":[
"Compact"
],
"operator":"OR"
},
{
"type":"RangeQuery",
"characteristicId":712745,
"characteristicName":"Sensor photo detectors (megapixels)",
"value":[
10,
53
]
}
]
我做错了什么?我如何调整代码以便通过DecisionAnalysisRequest正确查找DecisionAnalysisDocuments,即使filterQueries包含数据
更新
这是一个示例DecisionAnalysisRequest文档,我将使用它作为本文档中的关键信息,每次在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
]
}
]
}
查询是在服务器端运行的,所以您必须从服务器的角度来研究性能 您将达到16MB内存限制,以实现文档连续数据增长 您必须使用点符号到达filterQueries嵌入文档进行比较 如果要匹配其中一个过滤器,请参见下面的示例
@Query("{decisionAnalysisRequest.filterQueries :?0}")
DecisionAnalysis findByDecisionAnalysisRequest(BasicQuery filter);
将输入DecisionAnalysisRequest与具有更多筛选器查询的数据库DecisionAnalysisRequest进行比较时未得到响应的原因
您应该查看document/embedded document/embedded array字段上的比较条件,以比较整个document/embedded document/embedded array。这是因为它将尝试将mongo中的对象与您作为参数传递给使用equals方法的方法的对象进行比较。如果您的类中没有,它将采用默认的Equals方法,并将失败,因为它进行了深度比较。尝试在DecisionAnalysisRequest类中定义equalsand当然是hashcode方法,不要在equals方法定义中包含filterQueries,您也不应该在哈希代码中包含该字段。另一个解决方案可能是在DecisionAnalysisRequest类中包含一个像id这样的唯一字段,并使用该id进行查询。如果新的唯一字段名为id,那么您的repositoryMethod将类似于findByDecisionAnalysisRequest\u id…@pvpkiran感谢您的回答。为什么我不需要在equals/hashcode方法中包含filterQueries?filterQueries是DecisionAnalysisRequest对象唯一性的重要组成部分。此外,我不能使用任何代理ID字段,根据我的业务逻辑,关键是DecisionAnalysisRequest本身,它包含所有内部数据,包括filterQueries,当然您也可以使用。那么在这种情况下,你应该对每个子字段进行深入的比较我已经尝试过了,但由于某些原因它不起作用谢谢你的回答,但我需要通过DecisionAnalysisRequest对象而不是基本查询来找到DecisionAnalysis。filterQueries只是DecisionAnalysisRequestNp的一部分。好的,那么你需要用相同的字段、顺序和值来传递整个文档。如果在查询中只包含部分filterQueries,您认为它在mongodb端应该如何工作?Spring本质上是试图将您的输入转换为等效的mongo查询。我只是想了解您的用例。我不仅仅包括filterQueries。。我仅以filterQueries为例。我还将完整的DecisionAnalysisRequest与filterQueries一起用于DecisionAnalysis查找。另外,当我说数据将增长时——我的意思是,我将在MongoDB中存储数百万个DecisionAnalysis文档,但这些文档中没有一个会达到16MB的限制。好的。尝试调试以查看在发送完整的DecisionAnalysisRequest时生成的查询,如更新中所示。这应该与你的方法相同。首先,您可以在DecisionAnalysisRequest上创建索引,但我认为,如果您可以将可查询字段标识为与完整文档匹配相反的字段,则会非常有效。
{
"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
]
}
]
}
@Query("{decisionAnalysisRequest.filterQueries :?0}")
DecisionAnalysis findByDecisionAnalysisRequest(BasicQuery filter);