如何在mongodb中查询嵌入式文档的数组。
{
_id: 1,
zipcode: "63109",
students: [
{ name: "john", school: 102, age: 14 },
{ name: "jess", school: 102, age: 11 },
{ name: "jeff", school: 108, age: 15 }
]
}
{
_id: 2,
zipcode: "63110",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 3,
zipcode: "63109"
}
对于上述数据,我们将如何仅检索age> = 7和age <= 10的那些行。对于id_1,仅应返回年龄为10的行。 id_2和id_3中的两行。另外,id_4没有称为学生的字段。因此,我不希望在输出中看到它。
编辑:- 进行过滤时,我得到的输出看起来像这样。但我不希望具有“无”的行。 最后一个文档_id:3没有现场学生,但是对学生进行了过滤,因此输出具有与之对应的“无”。
我希望处理2个案例:
这两种情况都经过简单过滤后最终会出现在输出中。
{'_id': ObjectId('5cdaefd393436906b016ddb4'),
'students': [{'name': ajax,
'school': '100',
'age': '7'},
{'name': achilles,
'school': '100',
'age': '8'}],
{'_id': ObjectId('5cdaefd393436906b016ddb3'), 'students': None}
注意:我使用的是不同但相同的数据集,因此输出不准确,但希望您能理解。 “学生”是嵌入式文档,可能会或可能不会出现在所有文档中。
答案 0 :(得分:1)
您可以使用以下汇总
db.collection.aggregate([
{ "$match": { "$expr": { "$gte": [{ "$size": { "$ifNull": ["$students", []] } }, 1] }}},
{ "$addFields": {
"students": {
"$filter": {
"input": { "$ifNull": ["$students", []] },
"cond": {
"$and": [
{ "$gte": ["$$this.age", 7] },
{ "$lte": ["$$this.age", 10] }
]
}
}
}
}}
])