2016-06-28 89 views
0

关于MongoDB数据模型存在很多关于存储旧修订文档的文章和SO问题。MongoDB-修订数据设计

但是,我没有发现任何满足我的要求之一;我需要追溯查询数据库以明确查找与给定时间点的任意条件相匹配的所有文档。

为了澄清,我需要能够有效地回答这个问题;

“在时间T哪些文档(和优选版本)匹配条件{X:Y ...}”。

伪代码:

/* 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. 在每个版本中都有一个from/to,并且每当我编写一个新版本时,都要更新以前版本的“to”以匹配新版本。但是,我还没有找到一种方法来做到这一点原子或最终的一致性,这意味着多个更新可能会造成严重破坏和创建不明确的时间表。 (相同时间点的双项)

任何想法?

编辑 #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 
      } 
     } 
    ] 
} 

聚合框架例如

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