【发布时间】:2021-01-13 21:44:35
【问题描述】:
我需要根据动态键进行分组。所以我使用 $objectToArray 来查询动态键。
但我需要根据条件过滤掉文档,以减少进入 $objectToArray 的输入。因为我有数百万个文档,我只想将对象字段的一个子集提供给 $objectToArray 运算符。
我的目标是通过减少传递给 $objectToArray 运算符的数据量来获得更好的查询性能
我的文档结构的示例格式:
[
{
"fields": {
"field_1": { /* dynamic key */
"name": "f1",
"first": {
"check": true
}
},
"field_2": { /* dynamic key */
"name": "f2",
"second": {
"check": true
}
},
"description": "abc",
"summary": {
"val": "xyz"
}
}
},
{
"fields": {
"field_1": { /* dynamic key */
"name": "f1",
"second": {
"check": false
}
},
"field_2": null, /* dynamic key */
"field_3": { /* dynamic key */
"name": "f3",
"second": {
"check": true
},
"first": {
"check": true
}
},
"description": "lmn",
"summary": {
"val": "abc"
}
}
}
]
我需要根据以下条件过滤掉文档,然后再将其提供给 $objectToArray 运算符:
-
fields.<*dynamicKey*>.first存在
或 -
fields.<*dynamicKey*>.second存在
预期输出:
[
{
"fields": {
"field_1": {
"name": "f1",
"first": {
"check": true
}
},
"field_2": {
"name": "f2",
"second": {
"check": true
}
}
}
},
{
"fields": {
"field_1": {
"name": "f1",
"second": {
"check": false
}
},
"field_3": {
"name": "f3",
"second": {
"check": true
},
"first": {
"check": true
}
}
}
}
]
如何在不更改文档结构的情况下实现此用例?
db.collection.aggregate([
{
I need a stage to filter out documents here
},
{
$project: {
data: {
$objectToArray: "$fields"
}
}
}
My aggregation query to group based on dynamic keys can be found here:
【问题讨论】:
标签: mongodb filter mongodb-query aggregation-framework