Один документ имеет массив атрибутов с атрибутом-идентификатором и значением. Я хочу получить объект, сопоставив атрибут-Id и значения, соответствующие каждому объекту атрибута в массиве с несколькими операторами. ПРОБЛЕМА. При выполнении API Search GET любой идентификатор атрибута, который имеет значение, в котором выполняется поиск, будет выбран, а не идентификатор конкретного атрибута, который должен быть единственным ответом, который был выбран. Идентификаторы атрибутов с перекрестными ссылками, полученные из-за того, что они имеют одинаковое значение атрибута, являются причиной root проблемы.
Ниже мой объект MongoDB JSON
{
"_id" : ObjectId("5e3a6db03efb0c370c08c984"),
"file" : {
"filePath" : "https://file path",
"size" : "16KB",
"type" : "pdf"
},
"filePageCount" : 1,
"receivedDate" : ISODate("2019-01-19T18:30:00.000Z"),
"documentTypeId" : "5e2c4d606c1ac06b776b9ac8",
"versionNumber" : 1,
"attributes" : [
{
"attributeId" : "5e2c49a46c1ac06b776b9968",
"value" : NumberLong(12345)
},
{
"attributeId" : "5e2c49a66c1ac06b776b9969",
"value" : NumberLong(67890)
},
{
"attributeId" : "5e2c49af6c1ac06b776b996f",
"value" : "app999"
},
{
"attributeId" : "5e2c49ad6c1ac06b776b996e",
"value" : "amount888"
},
{
"attributeId" : "5e2c4a846c1ac06b776b99f0",
"value" : ISODate("2020-02-02T00:00:00.000Z")
},
{
"attributeId" : "5e2c4a856c1ac06b776b99f1",
"value" : ISODate("2020-03-03T00:00:00.000Z")
}
],
"_class" : "com.uacc.drs.entity.Documents"
}`enter code here`
перепробовал несколько типов методов.
List<Documents> resultDocument = new ArrayList<Documents>();
// to save list of criteria
ArrayList<Criteria> c = new ArrayList<Criteria>();
Query query = new Query();
query.fields().include("_id");
query.fields().include("documentTypeId");
query.fields().include("attributes");
String[] values = queries.split("\\|");
Object data = dataTypeConvertion(values[0], values[2]);
switch (values[1]) {
case "equalTo":
logger.debug("attributes values if equalTo");
Criteria c1 = Criteria.where("attributes.attributeId").is(values[0])
.andOperator(Criteria.where("attributes.value").is(data));
c.add(c1);
break;
case "lessThan":
logger.debug("attributes values if lessThan");
Criteria c2 = Criteria.where("attributes.attributeId").is(values[0])
.andOperator(Criteria.where("attributes.value").lt(data));
c.add(c2);
break;
case "greaterThan":
logger.debug("attributes values if greaterThan");
Criteria c3 = Criteria.where("attributes.attributeId").is(values[0])
.andOperator(Criteria.where("attributes.value").gt(data));
c.add(c3);
break;
}
query.addCriteria(new Criteria().andOperator(c.toArray(new Criteria[c.size()])));
// get documents based on the query criteria
List<Documents> documents = mongoTemplate.find(query, Documents.class);
второй метод с последующим использованием объектного сопоставителя и метода forEach.
String[] values = search.split("\\|");
ObjectMapper oMapper = new ObjectMapper();
Object data = dataTypeConvertion(values[0], values[2]);
DocumentsAttributes attributesAnd = new DocumentsAttributes();
attributesAnd.setAttributeId(values[0]);
attributesAnd.setValue(data);
Map<String, Object> att = oMapper.convertValue(attributesAnd, Map.class);
Criteria expression = new Criteria();
att.forEach((key, value) -> expression.and("attributes." + key).is(value));
c.add(expression);
query.addCriteria(new Criteria().andOperator(c.toArray(new Criteria[c.size()])));
return mongoTemplate.find(query, Documents.class);
Пожалуйста, дайте решение, спасибо заранее.