如何解决在使用$ objectToArray之前如何基于动态键过滤出文档?
我需要根据动态键进行分组。因此,我使用$ 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
},"description": "lmn","summary": {
"val": "abc"
}
}
}
]
我需要根据以下条件过滤掉文档,然后将其馈送到$ objectToArray运算符:
-
fields.<*dynamicKey*>.first
存在
或 -
fields.<*dynamicKey*>.second
存在
预期输出:
[
{
"fields": {
"field_1": {
"name": "f1","field_2": {
"name": "f2","second": {
"check": true
}
}
}
},{
"fields": {
"field_1": {
"name": "f1","field_3": {
"name": "f3","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:
解决方法
您可以尝试
-
使用
-
$objectToArray
作为字段数组输入,并使用check
检查第一和第二字段$type
的类型是否为布尔值(布尔型) - 使用
fields
将$arrayToObject
数组转换为对象
$filter
进行转换后,db.collection.aggregate([
{
$project: {
fields: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$fields" },cond: {
$or: [
{ $eq: [{ $type: "$$this.v.first.check" },"bool" ] },{ $eq: [{ $type: "$$this.v.second.check" },"bool"] }
]
}
}
}
}
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。