Mongo:从数组切片返回特定字段

时间:2017-08-03 15:50:49

标签: mongodb mongodb-query

我想从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返回一个字段?

谢谢!

2 个答案:

答案 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转换为数组视图(kv对的数组)和$filter上的English密钥,以保持匹配的键值对和$arrayToObject转换回文档。

这样的东西
{
  "$project": {
    "output": {
      "$arrayToObject": {
        "input": {
          "$filter": {
            "input": {
              "$objectToArray": {
                "$arrayElemAt": [
                  "$report_cards",
                  0
                ]
              }
            },
            "as": "result",
            "cond": {
              "$eq": [
                "$$result.k",
                "English"
              ]
            }
          }
        }
      }
    }
  }
}