Clojure — операторы Monger — отсутствует поддержка нескольких полей и запросов с преобразованием даты

У меня есть набор данных на монго, например:

{"month": 9, "year": 2015, "name": "Mr A"}
{"month": 9, "year": 2015, "name": "Mr B"}
{"month": 10, "year": 2015, "name": "Mr B"}
{"month": 11, "year": 2016, "name": "Mr B"}

Я пытаюсь получить минимальную дату от этого, используя monger, но безуспешно.

Лучшее, что я мог сделать, это придумать отдельный месяц и год, используя:

(mc/aggregate mongo-connection collection-name [{$group { :_id { :month "$month", :year "$year" } } }]))

Что дало результат вроде:

[{"_id":{"year":2016,"month":11}},
 {"_id":{"year":2016,"month":10}},
 {"_id":{"year":2016,"month":9}}]

И затем я использую библиотеки clojure, чтобы получить минимальную дату. Есть ли прямой способ использования monger?


person Mrinal Saurabh    schedule 13.09.2016    source источник


Ответы (1)


Чтобы сделать это в monger, вы можете отсортировать результат сначала по возрастанию года, затем по возрастанию месяца, а затем выбрать первый результат.

Вот модифицированный пример из документации:

(ns my.service.server
  (:refer-clojure :exclude [sort find])
  (:require [monger.core :as mg]
            [monger.query :refer :all]))

(let [conn (mg/connect)
      db   (mg/get-db "your-db")
      coll "your-coll"]
  (with-collection db coll
    (find {})
    (fields [:year :month])
    ;; it is VERY IMPORTANT to use array maps with sort
    (sort (array-map :year 1 :month 1))
    (limit 1))

Если вы будете делать это часто, рассмотрите возможность добавления в коллекцию индекса, чтобы ускорить запрос:

(ns my.app
  (:require [monger.core :as mg]
            [monger.collection :as mc]))

(let [conn (mg/connect)
      db   (mg/get-db "your-db")
      coll "your-collection"]

  ;; create an index on multiple fields (will be automatically named year_1_month_1 by convention)
  (mc/ensure-index db coll (array-map :year 1 :month 1)))
person ASRye    schedule 14.09.2016