1.示例数据
db.test.insert(
{
"className" : "test_1",
"studentNumber" : 5,
"students" : [{
"name" : "xiaoming",
"sex" : true,
"age" : 19
}, {
"name" : "xiaohua",
"sex" : false,
"age" : 17
}, {
"name" : "daming",
"sex" : true,
"age" : 17
}, {
"name" : "dahua",
"sex" : false,
"age" : 18
}, {
"name" : "tom",
"sex" : true,
"age" : 18
}]
}
)
2.查询描述
上面是我们的示例数据,有的时候我们在子查询时,不想把所有的子集全部查询出来,可能只想查出一部分满足条件的。那么我们可以使用$filter
来实现。
- 现在我要只想查出班级中,性别为男的数据。
db.test.aggregate([
{
"$project" : {
"className" : 1,
"studentNumber" : 1,
"students" : {
"$filter" : {
"input" : "$students",
"as" : "item",
"cond" : {
"$eq" : ["$$item.sex", true]
}
}
}
}
}
])
- 我想把男生女生分组在两个不同子集
db.test.aggregate([
{
"$project" : {
"className" : 1,
"studentNumber" : 1,
"boy" : {
"$filter" : {
"input" : "$students",
"as" : "item",
"cond" : {
"$eq" : ["$$item.sex", true]
}
}
},
"gril" : {
"$filter" : {
"input" : "$students",
"as" : "item",
"cond" : {
"$eq" : ["$$item.sex", false]
}
}
}
}
}
])
3.语法解析
官网关于
$filter
解析,点击