2016-06-28 3 views
0

Существует множество статей и SO-вопросов о модели данных MongoDB для хранения старых версий документов.MongoDB-дизайн для пересмотренных файлов

Однако я не нашел ничего, удовлетворяющего одному из моих требований; Мне нужно иметь возможность ретроактивно запрашивать базу данных, чтобы однозначно найти все документы, которые соответствовали произвольным критериям для данного момента времени.

Чтобы уточнить, мне нужно иметь возможность эффективно ответить на вопрос;

«Какие документы (и предпочтительно версии) соответствуют критериям {X: Y ...} в момент времени T".

псевдокод:

/* Would match a version that were active from 2010 - 2016-05-01 with zipcode 12345 */ 
db.my_objs.find({zipcode: "12345", ~time: ISODate("2016-01-01 22:14:31.003")~}) 

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

  1. Имея простой «от» -timestamp данных, а затем выберите «первый пункт перед моей запрошено, что временной точкой также соответствует другим критериям», но мне не удалось выразить, что в Монго.
  2. Имея от/до каждой версии и всякий раз, когда я пишу новую версию, обновляйте «до» в предыдущей версии, чтобы она соответствовала новой версии. Тем не менее, я не нашел способ сделать это атомарно или с возможной согласованностью, то есть несколько обновлений могут привести к хаосу и создать неоднозначные временные рамки. (Двойные записи для одной и той же временной точки)

Любые идеи?

редактировать нежелательного Примера запрос для # 1

db.my_objs.find({ 
    data : { 
     $elemMatch : { 
      from : { 
       $lte : ISODate('2015-01-01') 
      } 
     } 
    } 
}, { 
    "data.$" : 1 
}).forEach(function (obj) { 
        if(obj.data[0].state == 'active') { 
     printjson(registrar) 
    } 
})– 
+0

могли бы вы показать запрос для 'точки 1'? – profesor79

+0

Как я уже писал, я не смог выразить такой запрос? – Rawler

+0

ОК, получил это - думал, что у вас был набросок этого – profesor79

ответ

0

рамок агрегации и $unwind фазы, которая преобразует массив в единый документ таким образом, мы можем создать сложные $match условия

Пример документ

{ 
    "_id" : ObjectId("577275589ea91b3799341aba"), 
    "title" : "Test of design", 
    "firstCreated" : ISODate("2016-06-28T13:02:16.156Z"), 
    "lastUpdated" : ISODate("2016-06-28T13:02:16.156Z"), 
    "firstAuthor" : "profesor79", 
    "lastAuthor" : "Rawler", 
    "versions" : [{ 
      "versionId" : 1.0, 
      "dateCreated" : ISODate("2015-10-10T00:00:00.000Z"), 
      "datePublished" : ISODate("2015-10-12T00:00:00.000Z"), 
      "isActive" : false, 
      "documnetPayload" : { 
       "a" : 1.0, 
       "b" : 2.0, 
       "c" : 3.0 
      } 
     }, { 
      "versionId" : 2.0, 
      "dateCreated" : ISODate("2015-12-10T00:00:00.000Z"), 
      "datePublished" : ISODate("2015-12-31T00:00:00.000Z"), 
      "isActive" : true, 
      "documnetPayload" : { 
       "a" : 1.0, 
       "b" : 3.0, 
       "c" : 30.0 
      } 
     }, { 
      "versionId" : 3.0, 
      "dateCreated" : ISODate("2016-01-31T00:00:00.000Z"), 
      "datePublished" : ISODate("2016-02-21T00:00:00.000Z"), 
      "isActive" : true, 
      "documnetPayload" : { 
       "a" : 11.0, 
       "b" : 3.0, 
       "c" : 31.0 
      } 
     } 
    ] 
} 

рамочным Aggregation например

db.rawler.aggregate([{ 
      $match : { 
       "_id" : ObjectId("577275589ea91b3799341aba") 
      } 
     }, { 
      $unwind : "$versions" 
     }, { 
      $match : { 
       $and : [{ 
         "versions.dateCreated" : { 
          $gt : ISODate("2015-10-10T00:00:00.000Z") 
         } 
        }, { 
         "versions.dateCreated" : { 
          $lte : ISODate("2016-01-30T00:00:00.000Z") 
         } 
        } 
       ], 

       "versions.datePublished" : { 
        $gt : new Date("2015-10-13T00:00:00.000") 
       }, 
       // "versions.versionId" :{$in:[1,3,4,5]}, 

      } 
     }, { 
      $sort : { 
       "versions.dateCreated" : -1 
      } 
     }, 

    ]) 
+0

«Сдвиг данных в приложение», может быть выполнен с использованием практически любого дизайна. (Например, в примере, который я дал вам по запросу) Желание/желание здесь состояло в том, чтобы быстро ответить на вопрос «какие документы (и, желательно, версии) в заданное время имеют атрибут X, установленный в Y», на стороне сервера и предпочтительно, по крайней мере, с помощью индексов. Я не вижу, как это можно использовать с этой предлагаемой схемой. Как будет выглядеть такой запрос? – Rawler

+0

Что такое стандартный размер одного документа? – profesor79

+0

Отдельный документ-версия; 1-2KB. (До 25 версий на протяжении всей жизни) – Rawler

Смежные вопросы