在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'}}}}}}]}
答案 0 :(得分:0)
您的结构不理想,但您可以使用以下查询。
以下$match
阶段$and
的两个条件。在category
($elemMatch
)数组下的categories
数组($elemMatch
)中查找满足($all
)Portfolio
与{{1}匹配的元素值条件后跟具有ABCDEF
值的元素的条件。
Currrency
阶段是分解$unwind
后跟categories
以保留$match
Currency
嵌入式数组文档。
category
阶段是分解$unwind
后跟category
以删除$match
Currency
嵌入文档。
最后两个阶段是将Value
+ $group
剩余数据导入嵌入数组,$push
$project
值。
您可以一次运行一个阶段来查看中间输出以便更好地理解。
Currency