MongoDB查询并选择内部对象

时间:2018-12-19 06:56:35

标签: java mongodb mongodb-query aggregation-framework spring-data-mongodb

我想查询内部对象,并从mongoddb文档中仅选择过滤的内部对象。

请考虑下面的mongodb文档。

{
  "schools": [
    {
      "name": "ABC",
      "students": [
        {
          "name": "ABC 1",
          "class": 1
        },
        {
          "name": "ABC 2",
          "class": 2
        },
        {
          "name": "ABC 3",
          "class": 1
        }
      ]
    },
    {
      "name": "XYZ",
      "students": [
        {
          "name": "XYZ 1",
          "class": 1
        },
        {
          "name": "XYZ 2",
          "class": 2
        }
      ]
    }
  ]
}

我只选择第一堂课的学生。 预期结果json如下。

{
  "school": {
    "name": "ABC",
    "students": [
      {
        "name": "ABC 1",
        "class": 1
      },
      {
        "name": "ABC 3",
        "class": 1
      }
    ]
  },
  "school": {
    "name": "XYZ",
    "students": [
      {
        "name": "XYZ 1",
        "class": 1
      }
    ]
  }
}

即使以下结果对我来说也很好。

{
  "students": [
    {
      "name": "ABC 1",
      "class": 1
    },
    {
      "name": "ABC 3",
      "class": 1
    },
    {
      "name": "XYZ 1",
      "class": 1
    }
  ]
}

请帮助我完成此操作。 如果可以提供mongodb查询确实很有帮助。 我在我的应用程序中使用mongodb和spring数据。

2 个答案:

答案 0 :(得分:0)

您可以搜索mongo db数组嵌套记录搜索。示例代码在这里。 Document is here.

db.your_collection_name.find({'school.student.class':1})

如果您只希望学生为您的成绩做平面图。 Here is document for flatmap in mongodb

答案 1 :(得分:0)

最后我可以找到查询。 首先,我必须放松并应用匹配条件。这对我来说是工作。

db.{mycollection}.aggregate(
    [
        { $unwind: '$schools.students'}, 
        { $match : { "schools.students.class" : 1 } }, 
        { $project : { "schools.name" : 1, 'schools.students' : 1 }  } 
    ] 
);