как получить объект mongoDB по запросу mongoTemplate в java, по вложенному массиву значений ключа объекта - PullRequest
0 голосов
/ 05 февраля 2020

Один документ имеет массив атрибутов с атрибутом-идентификатором и значением. Я хочу получить объект, сопоставив атрибут-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);

Пожалуйста, дайте решение, спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...