如何在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}
注意:我使用的是不同但完全相同的数据集,因此输出结果并不准确,但希望您能理解。“学生”是嵌入式文档,可能会或可能不会出现在所有文档中。
编辑:最后,我使用了放宽来实现我想要的。
您可以使用以下汇总
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] }
]
}
}
}
}}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句