Какой лучший способ найти мин и макс в одном и том же запросе Mongodb - PullRequest
0 голосов
/ 03 мая 2018

Извините, что беспокою вас, но я не могу найти рабочее решение моего вопроса. Я хочу сделать запрос MongoDB, который дает мне те же результаты из запроса SQL: SELECT MIN(ZIP) AS MIN, MAX(ZIP) AS MAX FROM table WHERE BUSINESS_STATE_TERRITORY='Arizona' Прежде всего, я запрашиваю базу данных из Java с помощью драйвера mongodb java версии 3.6. Я пробовал это решение из Как найти минимальное значение в mongodb

db.sales.aggregate(
[
  {
    $group:
    {
      _id: "$item",
      minQuantity: { $min: "$quantity" }
    }
  }
]
)

В Java:

Document min = new Document("$min","$ZIP");
Document max = new Document("$max","$ZIP");
Document group = new Document("$group", new Document("_id","$Business_State_Territory").append("minimum",min).append("maximum",max));
Document match = new Document("$match", new Document("Business_State_Territory","Arizona"));
AggregateIterable output = coll.aggregate(Arrays.asList(match,group));
MongoCursor<Document> cur = output.iterator();
    while(cur.hasNext()){
        Document next = cur.next();
        System.out.println(next.toString());
    }

результат:

Document{{_id=Arizona, minimum=1608, maximum=null}}

Но это не оценка максимального значения, то есть 99701.

Все документы в коллекциях имеют следующую структуру:

_id:5ad0aea8471aa1aa7f425885
NPI:1003000142
CCN:""
Provider_Type:"EP"
Business_State_Territory:"Ohio"
ZIP:43623
Specialty:"Pain Medicine"
Hospital_Type:""
Program_Type:"Medicare"
Program_Year:2016
Provider_Stage_Number:"Stage 2"
Payment_Year:3
Attestation_Month:2
Attestation_Year:2017
MU_Definition_2014:""
Stage_2_Scheduled_2014:0
EHR_Certification_Number:"1314E01QPVPIEAN"
EHR_Product_CHP_Id:"CHP-027887"
Vendor_Name:"Epic Systems Corporation"
EHR_Product_Name:"EpicCare Ambulatory 2014 Certified EHR Suite"
EHR_Product_Version:"Epic 2015"
Product_Classification:"Complete EHR"
Product_Setting:"Ambulatory"
Product_Certification_Edition_Yr:2014

Надеюсь, вы мне поможете. Начать редактирование: Я попытался использовать $ project вместо $ group только с предложением max. Теперь итоговые документы имеют структуру:

Document{{_id=5ad0aea8471aa1aa7f425955, Business_State_Territory=Arizona, maximum=85255}}

Как видите, максимальное значение не пустое, но значения не представляют максимальное значение. Странно также то, что некоторые документы:

Document{{_id=5ad0aea9471aa1aa7f426881, Business_State_Territory=Arizona, maximum=}}

Может ли mongodb интерпретировать это пустое значение как максимальное значение? На docs.mongodb.com он говорит: Если некоторые, но не все документы для операции $ max имеют либо нулевое значение для поля, либо пропускают поле, оператор $ max рассматривает только ненулевое и не пропущенные значения для поля. Таким образом, ответ должен быть «нет», пустое значение не принимается за результат запроса. Это ошибка?

1 Ответ

0 голосов
/ 03 мая 2018

Вы делаете это правильно, используя агрегацию. Вам не нужно делать mapReduce. Вы должны сделать исправление, хотя:

Когда вы используете оператор $ group, вам нужно ссылаться на любые поля документа с начальным $ , как в примере:

{ $group: {_id: "$item", minQuantity: { $min: "$quantity" } }

В вашем примере попробуйте добавить начальный $ к имени поля Business_State_Territory, например:

Document group = new Document("$group", new Document("_id","$Business_State_Territory").append("minimum",min).append("maximum",max));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...