Можно ли сделать условную агрегацию в Java Spring? - PullRequest
1 голос
/ 02 июля 2019

Я использую Spring и MongoDB с MongoTemplate.

У меня есть этот документ:

{
  price: 50.0,
  goal: {
       currentValue: 20,
       goal: 100
  }
}

Мне нужно сделать запрос, такой как ", принесите мне значения, где его текущее значение совпадает с целью " или ", принесите мне документы, где его текущее значение составляет 50% от его цель".

Возможно ли это сделать? До сих пор я выполнял такого рода запросы, но никогда не выполнял условных, где он использует текущие значения документов как часть условия.

Criteria criteria = Criteria.where("price").exists(true);

GroupOperation totalAggregation = group()
      .sum("goal.currentValue")
      .as("currentValue")
      .sum("goal.goal")
      .as("goal");
UnwindOperation unwind = unwind("$goal");
Aggregation aggregation = newAggregation(match(criteria), unwind, totalAggregation);

AggregationResults<Document> results = mongoTemplate
                .aggregate(aggregation,"Goals", Document.class);

Теперь я просто хочу привести сценарии, описанные выше. Как это сделать?

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Я пытался решить этот запрос: «принесите мне значения, где его текущее значение совпадает с целью» или «принесите мне документы, где его текущее значение составляет 50% от его цели».

Это можно сделать с помощью оператора $ where, где вы можете передать выражение JavaScript или простую функцию JavaScript, которая задает условие, которое вы хотите оценить.

https://docs.mongodb.com/manual/reference/operator/query/where/

Вот пример запроса, который я выполнил и дал ожидаемый результат:

db.getCollection("stackQues").find(
    {
      $or: [
                {$where: "this.goal.currentValue == this.goal.goal"}, 
                {$where: "this.goal.currentValue == this.goal.goal/2"}
            ]
    }
);
1 голос
/ 02 июля 2019

Поскольку вы можете использовать MongoDB 4.0.1, вы можете использовать $expr для получения желаемого результата.

Требуемый запрос будет выглядеть следующим образом:

db.criteria.find( { $expr: { $eq: [ "$goal.currentValue" , "$goal.goal" ] } } )

или, есливам нужно текущее значение как 50% от цели

db.criteria.find( { $expr: { $eq: [ "$goal.currentValue" , {divide : ["$goal.goal",2]} ] } } )

Я не знаю Spring, и как mongodb используется с Spring, поэтому я дал ответ в Mongo Shell.Вы можете написать синтаксис в Spring MongoTemplate.Идея состоит в том, чтобы использовать $expr для использования полей документа в состоянии соответствия.

для получения дополнительной информации читайте Официальная документация $ expr MongoDB .

Обновление :

Синтаксис MongoTemplate для этого же может выглядеть следующим образом (не проверено):

BasicQuery query1 = new BasicQuery("{ $expr: { $eq: [ '$goal.currentValue' , '$goal.goal' ] } }");
List<Document> = mongoOperation.find(query1, Document.class);

Попробуйте и скажите, есть ли какая-либо ошибка в приведенном выше запросе.Я только что попытался написать его в нужном вам синтаксисе.

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