【问题标题】:Finding a document that has a value in an array of an array of sub documents在子文档数组的数组中查找具有值的文档
【发布时间】:2014-12-13 15:25:04
【问题描述】:

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

{
    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']
            }
        ]
    }
]
}

所以,FormResponses 有一个header_responses 的数组,实习生有一个responses 的数组,然后有一个values 的数组。这是为了让系统保持历史记录,所以当我显示FormResponse 时,我只显示最后一组response ``values`,但我仍然有保存的历史记录。

现在我需要实现一个过滤系统,但我不确定如何实现。我需要做的是返回所有FormResponses,它们的header_field_id 等于某个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”的值,而不仅仅是最后一个。

【问题讨论】:

  • 预期输出是什么?
  • 我添加了更多细节。这里的关键是我只想匹配响应数组中的 LAST 子文档。

标签: mongodb mongodb-query


【解决方案1】:

header_field_id=2 和响应值=zzz 的示例

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

【讨论】:

  • 但这只会给我最后一个回复“zzz”的吗?
  • 我不确定这在一个查询中是什么可能的。 MongoDB 可以存储任意深度嵌套的数据结构,但不能有效地搜索它们。如果您的数据形成树、森林或图形,您实际上需要将每个节点及其边缘存储在单独的文档中。
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 2021-09-30
  • 2012-08-12
  • 1970-01-01
  • 2016-04-23
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多