Mongodb — какой тип данных для событий

Я новичок в Mongo DB.

Мне нужно создать коллекцию, которая может хранить события. Все документы в событии будут иметь ключи FROM_TIME и TO_TIME, значения которых могут различаться следующим образом:

  1. {FROM_TIME : "1 сентября 1939 г.", TO_TIME : "август 1945 г."}
  2. {FROM_TIME : "15 августа 1947 года", TO_TIME : "15 августа 1947 года"}
  3. {FROM_TIME : "1857", TO_TIME : "1858"}
  4. {FROM_TIME : "7 декабря 1944 г., 11:00", TO_TIME : "7 декабря 1944 г., 14:40"}
  5. {FROM_TIME : "январь 1971 г.", TO_TIME : "ноябрь 1972 г."}

Учитывая случайное возникновение FROM_TIME и TO_TIME, можно ли будет запрашивать такие события, как:

  1. Список событий второй половины 19 века
  2. Список событий 15 августа и так далее.

Я прошу людей здесь предоставить информацию на случай, если мне нужно будет переосмыслить структуру моей коллекции, поскольку я довольно наивен в Mongo (или любой другой нереляционной) БД.

***Первое редактирование начинается здесь

Я написал следующий код:

DBObject dbObject = new BasicDBObject();

        dbObject.put("EVNTATMC_ID", new ObjectId());
        dbObject.put("EVNTATMC_DESC", "Pearl Harbour");
        dbObject.put("EVNTATMC_FROM_TIME", Date.valueOf("1944-12-07"));
        dbObject.put("EVNTATMC_TO_TIME", Date.valueOf("1944-12-07"));
        dbObject.put("EVNTATMC_EVNTCMPD_ID", new ObjectId());
        dbObject.put("EVNTATMC_MTRL_ID", null);
        // dbObject.put("EVNTATMC_AUDIT", 1);
        dbObject.put("EVNTATMC_REMARKS", "First insert");

        eventAtomic.insert(dbObject);
dbObject = new BasicDBObject();

        dbObject.put("EVNTATMC_ID", new ObjectId());
        dbObject.put("EVNTATMC_DESC", "1857 Revolt");
        dbObject.put("EVNTATMC_FROM_TIME", "1857");
        dbObject.put("EVNTATMC_TO_TIME", "1858");
        dbObject.put("EVNTATMC_EVNTCMPD_ID", new ObjectId());
        dbObject.put("EVNTATMC_MTRL_ID", null);
        // dbObject.put("EVNTATMC_AUDIT", 1);
        dbObject.put("EVNTATMC_REMARKS", "Only years");

        eventAtomic.insert(dbObject);

Здесь я тупо использовал String для хранения неполных дат, но как мне хранить только год, например 1992, 2001, 2012, или только месяц, например, январь, сентябрь или что-то вроде августа 2010 года? Я не уверен, правильно ли я ожидаю! Пожалуйста, объясните мне, как я должен обрабатывать такие «неполные» тайминги.

***Первое редактирование заканчивается здесь


person Kaliyug Antagonist    schedule 19.11.2012    source источник


Ответы (1)


Сохраните FROM_TIME и TO_TIME как DateTime. См. здесь: http://www.mongodb.org/display/DOCS/Dates

Затем вы можете запросить (например, запрос rang)
см. ответ здесь: https://stackoverflow.com/a/8136834/131809

Итак, для всех событий 15 августа 2012 года:

var start = new Date(2012, 08, 15);
var end = new Date(2012, 08, 16);

db.myEventCollection.find({created_on: {$gte: start, $lt: end}});
person Alex    schedule 19.11.2012
comment
Привет, alexjamesbrown, я прочитал этот документ о дате. перед публикацией вопроса, и я не уверен, позволит ли этот тип данных хранить только год, только месяц и год, только месяц или такой тип «неполных» данных о дате; также предоставленный вами поток говорит: «Вы не можете напрямую запрашивать коллекции mongodb по компонентам даты, таким как день или месяц». Пожалуйста, направляйте. - person Kaliyug Antagonist; 19.11.2012
comment
Вы не можете напрямую запрашивать по месяцам, но вы можете запрашивать диапазон... поэтому, чтобы запросить по месяцам, как в моем примере, вы можете запросить более 1 января 2012 г. и менее 1 февраля 2012 г. - person Alex; 19.11.2012
comment
Я отредактировал свой вопрос - добавил фрагмент кода, демонстрирующий мой точный запрос. Пожалуйста, посмотрите и направьте меня. - person Kaliyug Antagonist; 20.11.2012
comment
Поскольку вы использовали строки, вы ничего не можете сделать, кроме == 1857 Вероятно, лучше всего сбросить данные и начать заново. - person Alex; 20.11.2012
comment
Я использовал String, так как не мог найти другого способа сохранить неполное время. Пожалуйста, скажите мне, возможно ли это, чтобы я мог подумать об альтернативах. - person Kaliyug Antagonist; 21.11.2012
comment
Это невозможно - например, вы не можете сделать ‹ 1999... это строка. Возможно, вы могли бы привести к int, но это было бы крайне неэффективно. Лучше всего повторно импортировать данные. Или напишите скрипт для преобразования ваших строковых полей в datetime или int. - person Alex; 21.11.2012
comment
Ok. Большое спасибо за ваш вклад. - person Kaliyug Antagonist; 22.11.2012