在mongodb中动态更改$unwind表达式的路径

2w2cym1i  于 2023-03-17  发布在  Go
关注(0)|答案(1)|浏览(123)

例如,我有以下数据:

{
    "_id": "1",
    "checker": true,
    "app": "firstApp",
    "changes": [
        {
            "old": "testOld",
            "new": "testNew"
        },
        {
            "old": "firstAppOld",
            "new": "firstAppNew"
        }
    ]
},
{
    "_id": "2",
    "checker": false,
    "app": "secondApp",
    "changes": ""
}

我想要的是动态地$展开这个数据。如果 “checker” = true,那么{$展开:“$changes”},否则{$unwind:“$app”}。或者如果 “checker” =真,则{$unwind:“$changes”},否则不执行任何操作。
我尝试添加一个字段:

{$addFields: {
        path: {
            $cond: {
                if: {$eq: ["$checker", true]},
                then: '$changes',
                else: '$app'
            }
        }
    }}

然后:

{$unwind: "$path"}

但我得到了这样的东西:

{
    "_id": "1",
    "checker": true,
    "app": "firstApp",
    "changes": [
        {
            "old": "testOld",
            "new": "testNew"
        },
        {
            "old": "firstAppOld",
            "new": "firstAppNew"
        }
    ],
    "path": {
        "old": "testOld",
        "new": "testNew"
    }
},
{
    "_id": "2",
    "checker": false,
    "app": "secondApp",
    "changes": "",
    "path": "secondApp"
}
9lowa7mx

9lowa7mx1#

$unwind stage接受字符串路径,而不是表达式,因此不能直接将变量传递给stage。
但是,您可以在展开阶段之前修改文档,例如:

  • 在$addFields阶段中使用$cond检查布尔值,以便有条件地将值移动到临时字段
  • $展开临时字段
  • 另一个$addFields阶段,用于有条件地将值移回原始字段
  • $project以删除临时字段

可能是这样的:

db.collection.aggregate([
  {$addFields: {
    temparray: {
      $cond: {
        if: "$unwindit",
        then: "$array",
        else: "Nope"
      }
    }
  }},
  {$unwind: "$temparray"},
  {$addFields: {
    array: {
      $cond: {
        if: "$unwindit",
        then: "$temparray",
        else: "$array"
      }
    },  
  }},
  {$project: {temparray: 0}}
])

Playground

相关问题