有很多关于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的不受欢迎的示例查询
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 :(得分: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
}
},
])