MongoDB设计用于修订数据

时间:2016-06-28 09:14:35

标签: mongodb database-design revision-history

有很多关于MongoDB数据模型的文章和SO问题,用于存储旧版本的文档。

但是,我发现没有什么能满足我的要求;我需要能够追溯查询数据库,以明确地找到符合给定时间点的任意标准的所有文档。

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

  

"在时间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,然后在我查询的时间点之前选择"第一项,这也符合其他条件",但我还没有设法表达在Mongo。
  2. 每个版本都有一个from / to,每当我写一个新版本时,都要更新"到"在以前的版本上匹配新版本。但是,我还没有找到一种原子方式或最终一致性的方法,这意味着多次更新可能会造成严重破坏并产生模糊的时间表。 (同一时间点的双重条目)
  3. 有什么想法吗?

    修改 针对#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)
        }
    })–
    

1 个答案:

答案 0 :(得分: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
            }
        },

    ])