我有一个这样的 struct -
[
{
"name": "person1",
"age": "16",
"marks": 91
},
{
"name": "person2",
"age": "18",
"qualification": [
{
"masters": [
{
"semester": {
"number": "1",
"subject": {
"computer": 56,
"english": 34,
"hindi": 92
}
}
},
{
"semester": {
"number": "2",
"subject": {
"computer": 54,
"english": 31
}
}
}
]
},
{
"bachelors": [
{
"semester": {
"number": "1",
"subject": {
"computer": 54,
"english": 81
}
}
},
{
"semester": {
"number": "2",
"subject": {
"computer": 67,
"english": 42
}
}
}
]
}
]
},
{
"name": "person3",
"age": "19",
"qualification": [
{
"masters": [
{
"semester": {
"number": "1",
"subject": {
"computer": 94,
"english": 100
}
}
},
{
"semester": {
"number": "2",
"subject": {
"computer": 45,
"english": 21
}
}
}
]
},
{
"bachelors": [
{
"semester": {
"number": "1",
"subject": {
"computer": 34,
"english": 63
}
}
},
{
"semester": {
"number": "2",
"subject": {
"computer": 60,
"english": 80
}
}
}
]
}
]
}
]
我想投射所有谁曾经得分90分或更多的名字.但条件并不比仅仅卖到90英镑更复杂.对于年龄小于18岁的人,我们需要判断marks
字段,对于年龄大于或等于18岁的人,我们需要查看所有computer
和english
(非印地语)字段.因此,在我们的例子中,它应该报告Person 1和Person 3.此查询将在大约marks
k条记录上运行,也应该是高性能的.我try 过$cond、$Match的各种组合.但还没能抓取一个适当的聚合查询-
db.collection.aggregate([
{
$match: {
"marks": {
$gte: 90,
$lte: 100
}
}
},
{
$project: {
"name": 1
}
}
])