我想从Mongo中的数组中返回特定字段,但我遇到了麻烦。
我们假设有一个类似的文件:
{
"student":"Bob",
"report_cards": [
{
"Year":2016,
"English":"B",
"Math":"A"
},
{
"Year":2015,
"English":"B",
"Math":"A"
}
]
}
我想返回以下内容:
{"Student": "Bob", {"English":"B"}}
基本上,我只需要报告卡数组中的第一个元素,并且只返回英文字段。
我知道这是件好事:
db.collection.find({},{"Student":1, "report_cards":{$slice:1}});
但是,这当然会导致完整的数组(年,英,数学)回归。我尝试过以下方法:
db.collection.find({},{"Student":1, "report_cards.$.english":{$slice:1}})
db.collection.find({},{"Student":1, "report_cards":{$slice:1, "$.english"}});
但这些都不正确。
如何在数组结果中从obj返回一个字段?
谢谢!
答案 0 :(得分:2)
您可以使用聚合框架将值设为
db.test.aggregate
([{$project:{_id:0,
student:'$student',
English:{ $arrayElemAt: ['$report_cards.English',0]
}}}])
答案 1 :(得分:1)
AFAIK没有用于过滤嵌入式文档中的键值对的内置运算符。
您可以使用运算符组合来实现最新的3.4版本。
以下查询使用$arrayElemAt
获取report_cards
中的第一个元素,然后$objectToArray
转换为数组视图(k
和v
对的数组)和$filter
上的English
密钥,以保持匹配的键值对和$arrayToObject
转换回文档。
像
这样的东西{
"$project": {
"output": {
"$arrayToObject": {
"input": {
"$filter": {
"input": {
"$objectToArray": {
"$arrayElemAt": [
"$report_cards",
0
]
}
},
"as": "result",
"cond": {
"$eq": [
"$$result.k",
"English"
]
}
}
}
}
}
}
}