【发布时间】:2019-08-27 19:26:37
【问题描述】:
如何在MongoDb中查询集合时过滤结果时避免空数组
[
{
"_id": ObjectId("5d429786bd7b5f4ae4a64790"),
"extensions": {
"outcome": "success",
"docType": "ABC",
"Roll No": "1"
},
"data": [
{
"Page1": [
{
"heading": "LIST",
"content": [
{
"text": "<b>12345</b>"
},
],
}
],
"highlights": [
{
"name": "ABCD",
"text": "EFGH",
}
],
"marks": [
{
"revision": "revision 1",
"Score": [
{
"maths": "100",
"science": "40",
"history": "90"
},
{
"lab1": "25",
"lab2": "25"
}
],
"Result": "Pass"
},
{
"revision": "revision 1",
"Score": [
{
"maths": "100",
"science": "40"
},
{
"lab1": "25",
"lab2": "25"
}
],
"Result": "Pass"
}
]
}
]
}
]
我正在寻找分数数组中只有“历史”标记的结果。
我尝试了以下查询(在 mongo 3.6.10 中),但它返回空分数数组以及具有历史记录的数组
db.getCollection('student_scores').find({
"data.marks.score.history": {
$not: {
$type: 10
},
$exists: true
}
},
{
"extensions.rollNo": 1,
"data.marks.score.history": 1
})
想要的输出是
{
"extensions": {
"rollNo": "1"
},
"data": [
{
"marks": [
{
"Score": [
{
"history": "90"
}
]
}
]
}
]
}
【问题讨论】:
-
建议您从查询中显示所需的输出文档; “只有分数数组中的历史标记”的细微差别可以改变查询的性质。还建议提供 2 个输入文档,一个与所需输出匹配,一个不匹配。并去掉
Page1、extensions等。这些与您寻找的过滤器无关,它使“复制和测试”材料变得更加困难。 -
我已经更正了 josn。我遇到嵌套数组,我的场景涉及不为空过滤以仅获取历史属性
-
我认为数据形状仍然有点......关闭。我不明白
Score对象数组的设计原理。您可以通过将Score作为一个简单对象来简化您的设计,例如Score: { "maths":100, "science":40, "lab1":25 }而且,这些分数应该是数字(整数)而不是字符串...... -
你能检查我的答案吗?它应该有助于满足您的要求并简化您的结果!
标签: arrays mongodb mongodb-query