对于我的新项目,我们开始使用 mongodb 作为文档存储库。它非常适合我们的要求,但现在我们需要对子子数组元素实现更高级的查询。
这是我们的文档示例:
{
"Asset" : {
"Metadata" : {
"Titolo" : {
"Value" : "Titolo 50271235"
},
"Platforms" : {
"Platform" : [
{
"@name" : "MY_PLATFORM_1",
"PublishingRanges" : {
"PublishingRange" : [
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
},
{
"@startdate" : ISODate("2013-10-05T00:00:00Z"),
"@enddate" : ISODate("2014-11-04T23:59:00Z")
}
]
}
},
{
"@name" : "MY_PLATFORM_2",
"PublishingRanges" : {
"PublishingRange" : [
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
},
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
}
]
}
},
{
"@name" : "MY_PLATFORM_3",
"AmbienteDiPubblicazione" : {
"#" : "Produzione"
},
"PublishingRanges" : {
"PublishingRange" : [
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
},
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
}
]
}
},
{
"@name" : "MY_PLATFORM_4",
"PublishingRanges" : {
"PublishingRange" : [
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
},
{
"@startdate" : ISODate("2013-09-05T00:00:00Z"),
"@enddate" : ISODate("2013-11-04T23:59:00Z")
}
]
}
}
]
}
}
}
}
}
如您所见,我们有一个“平台”数组,其中包含一个“PublishingRange”数组。我们需要的是找到元素“平台”满足这些约束的所有文档:
Platform.@name == VAR_PLATFORM
and(
(PublishingRange.@startdate > VAR_START && PublishingRange.@startdate < V_END)
)
当然,日期的限制必须满足 name== VAR_PLATFORM 的“平台”,而不是不同的“平台”
我尝试使用基于 $elemMatch 的查询,但没有成功。
谢谢你的任何建议。
最大限度