所以我有一个看起来像这样的文档:
{
"prop1" : [
{
"value" : [
{
"start" : "09:00",
"end" : "23:59"
},
{
"start" : "00:00",
"end" : "04:00"
}
]
}
]
}
我想查询值数组。
这是我正在尝试的查询:
db.getCollection('someCollection').find({
'prop1': {
$elemMatch: {
'value': {
$elemMatch: {
start: { $lte: '10:00' } ,
end: { $gte: '10:00' }
}
}
}
}
})
这是什么问题,或者在嵌套数组的嵌套数组中查询嵌套对象的正确方法是什么?
谢谢!
更新
我需要的输出是与prorp数组具有任何对象的文件相同,该对象的值数组具有至少一个与 start 和 end
匹配的元素{
"prop1" : [
{
"value" : [
{
"start" : "09:00",
"end" : "23:59"
},
{
"start" : "00:00",
"end" : "04:00"
}
]
}
]
}
答案 0 :(得分:1)
db.collection.aggregate([
{ "$project": {
"prop1": {
"$map": {
"input": "$prop1",
"as": "p",
"in": {
"value": {
"$filter": {
"input": "$$p.value",
"as": "v",
"cond": {
"$and": [
{ "$lte": ["$$v.start", "10:00"] },
{ "$gte": ["$$v.end", "10:00"] }
]
}
}
}
}
}
}
}}
])
[
{
"prop1": [
{
"value": [
{
"end": "23:59",
"start": "09:00"
}
]
}
]
}
]
答案 1 :(得分:0)
拥有这样的架构的更好方法:
"prop1" : [
{
"value" : [
{
"start" : {
"h" : 8,
"m" : 0
},
"end" : {
"h" : 23,
"m" : 59
}
},
{
"start" : {
"h" : 1,
"m" : 0
},
"end" : {
"h" : 4,
"m" : 0
}
}
]
}
]
并使用这样的查询
db.yourCollection.find( {"prop1.value":
{
$elemMatch: {
'start.h': { $lte: 8 }, 'start.m': { $lte: 0 }, 'end.h': { $gte: 3 }, 'end.m': { $gte: 59 }
}
}
})