使用mongodb聚合来匹配文档并获取字段的所有值

时间:2017-04-05 18:57:23

标签: mongodb

在Mongo 3.4中

我有一个包含以下格式的文档的集合:

类型1:

{
"Level1": {
    "@version": "genR",
    "@revision": "aux",
    "Level2": {
        "container": {
            "type": "ARRAY",
            "categories": [
                {
                    "category": [
                        {
                            "Type": "STRING",
                            "Value": "Currency"
                        },
                        {
                            "Type": "STRING",
                            "Value": "EUR"
                        }
                    ]
                },
                {
                    "category": [
                        {
                            "Type": "STRING",
                            "Value": "Portfolio"
                        },
                        {
                            "Type": "STRING",
                            "Value": "ABCDEF"
                        }
                    ]
                },
             ]
          }
      }
  }
}

类型2:

 {
"Level1": {
    "@version": "genR",
    "@revision": "aux",
    "Level2": {
        "container": {
            "type": "ARRAY",
            "categories": [
                {
                    "category": [
                        {
                            "Type": "STRING",
                            "Value": "Currency"
                        },
                        {
                            "Type": "STRING",
                            "Value": "EUR"
                        }
                    ]
                },
                {
                    "category": [
                        {
                            "Type": "STRING",
                            "Value": "Portfolio"
                        },
                        {
                            "Type": "STRING",
                            "Value": "ABCDEF"
                        }
                    ]
                },
                {
                    "category": [
                        {
                            "Type": "STRING",
                            "Value": "Short Description"
                        },
                        {
                            "Type": "STRING",
                            "Value": "Cash Only"
                        }
                    ]
                },
             ]
          }
      }
  }
}

如何编写汇总语句,以便仅从投资组合匹配特定值的文档中获取所有货币值。

我一直在使用pymongo的聚合框架,如下所示:

pipeline = [{"$unwind":"$Level1.Level2.container.categories"},{"$unwind":"$Level1.Level2.container.categories.category"},{"$match":{"Level1.Level2.container.categories.category.Value":"Portfolio"}}]
pprint(db.command('aggregate',collection,pipeline=pipeline))

但没有结果。 Pymongo有点令人困惑。即使有人可以指出一般方法,它也会有所帮助。

假设4个匹配文件(每个具有不同数量的类别项目)的预期响应是:

{'Currency': [{'Level1': {'Level2': {'container': {'categories': {'category': {'Value': 'EUR'}}}}}},
          {'Level1': {'Level2': {'container': {'categories': {'category': {'Value': 'EUR'}}}}}},
          {'Level1': {'Level2': {'container': {'categories': {'category': {'Value': 'USD'}}}}}},
          {'Level1': {'Level2': {'container': {'categories': {'category': {'Value': 'EUR'}}}}}}]}

1 个答案:

答案 0 :(得分:0)

您的结构不理想,但您可以使用以下查询。

以下$match阶段$and的两个条件。在category$elemMatch)数组下的categories数组($elemMatch)中查找满足($allPortfolio与{{1}匹配的元素值条件后跟具有ABCDEF值的元素的条件。

Currrency阶段是分解$unwind后跟categories以保留$match Currency嵌入式数组文档。

category阶段是分解$unwind后跟category以删除$match Currency嵌入文档。

最后两个阶段是将Value + $group剩余数据导入嵌入数组,$push $project值。

您可以一次运行一个阶段来查看中间输出以便更好地理解。

Currency