对于我的新项目,我们开始使用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")
}
]
}
}
]
}
}
}
}
}
正如您所看到的,我们有一个“Platform”数组,其中包含一个“PublishingRange”数组。 我们需要的是找到元素“平台”满足这些约束的所有文档:
Platform.@name == VAR_PLATFORM
and(
(PublishingRange.@startdate > VAR_START && PublishingRange.@startdate < V_END)
)
当然,日期的约束必须由名称== VAR_PLATFORM的“平台”满足,而不是在不同的“平台”上
我尝试过使用基于$ elemMatch的查询,但没有成功。
感谢您的任何建议。
最高
答案 0 :(得分:3)
由于无法告诉您在这里使用的驱动程序是shell解决方案:
db.foo.find({
"Asset.Metadata.Platforms.Platform": {
$elemMatch: {
"@name": VAR_PLATFORM,
"PublishingRanges.PublishingRange": {
$elemMatch: {
"@startdate": {$gt: VAR_START},
"@enddate": {$lt: VAR_END}
}
}
}
}
})
顺便说一句,您可以省略Platform
和PublishingRange
并将数组分别分配给Platforms
和PublishingRanges
来简化文档结构。