查找在子文档数组的数组中具有值的文档

时间:2014-12-13 15:25:04

标签: mongodb mongodb-query

我有一份遵循此表格的文件:

{
    created_by: 'user1',
    created_on: '2014-10-1022: 32: 12.000',
    submitted: true,
    submitted_on: '2014-10-1022: 32: 12.000',
    submitted_by: user2,
    approved: true,
    approved_by: 'adminUser2',
    approved_on: '2014-10-1022: 32: 12.000',
    form_title: 'FormTitle1',
    form_id: 12,
    header_responses: [
        {
            header_field_id: 1, sequence: 1,
            responses: [
                {
                    submitted_by: 'user1', submitted_on: '2014-10-1022: 32: 12.000',
                    values: ['xxx' ]
                }
            ]
        ]
    },
    {
        header_field_id: 2,
        sequence: 2,
        responses: [
            {
                submitted_by: 'user1', submitted_on: '2014-10-1022: 32: 12.000',
                values: ['yyy', 'zzz']
            },
            {
                submitted_by: 'user2', submitted_on: '2014-10-1022: 32: 12.000',
                values: ['aaa','bbb']
            }
        ]
    }
]
}

因此,FormResponse拥有header_responses数组,实习生的数组为responses,其数组为values。这是为了让系统保持历史记录,所以当我显示FormResponse时,我只显示最后一组response``值`,但我仍然记录了保存的历史。< / p>

现在我需要实现一个过滤系统,但我不确定如何。我需要做的是返回FormResponse等于某个ID且具有包含某些内容的最后一个响应值的所有header_field_id。我发现this posting,但它只处理一个级别的数组,我不知道如何处理它来处理两个级别。我尝试了一些东西,但它们都是荒谬和牵强的,所以我不会分享它们,因为它们注定要失败。

更新

预期回复:我希望能够搜索标题为_id且 last response具有某些值的文档。例如,FormResponse文档的标题ID是2,该标题的最后一个响应是'xyz'。这与“xyz”作为历史值的任何内容都不匹配。

更新2

我想我已经接近了这个:

FormResponses.find( {
  header_responses: {
    $elemMatch: {
      header_field_id: "BZ6NzfgxK4r38274d", 
      responses: {
        $elemMatch: {
          values: "9999"
        }
      }
    }
  }
}).fetch();

但是这匹配任何值都是“9999”,而不仅仅是最后一个。

1 个答案:

答案 0 :(得分:1)

header_field_id = 2和响应值= zzz

的示例
db.FormResponse.find({
    header_responses:{
        $elemMatch:{
            header_field_id:2,
            responses:{
                $elemMatch:{
                    values:'zzz'
                }
            }
        }
    }
})