【问题标题】:How to add a sub-document field with a condition in MongoDB?如何在 MongoDB 中添加带有条件的子文档字段?
【发布时间】:2021-09-21 07:05:20
【问题描述】:

我正在尝试添加一个带有条件的新子字段。
如果该字段已经存在,我不会覆盖它。
在不满足条件的情况下,我不想添加父对象。

这是我的收藏:

{type: "A", object: {a: "", b: "foo"}},
{type: "A", object: {a: ""}},
{type: "A"},
{type: "B"}

这是我的汇总:

{
  $addFields: {
    "object.b": {
      $cond: {
        if: {$eq: ["$type","A"]},
        then: {$ifNull: ["$object.b", "bar"]},
        else: "$DROP"
      }
    }
  }
}

$DROP 不是聚合命令,但在 else 情况下我不想添加新字段。
它不会创建b 字段,但仍保留父对象。

这是我目前的结果:

{type: "A", "object": {a: "", b: "foo"}},
{type: "A", "object": {a: "", b: "bar"}},
{type: "A", "object": {b: "bar"}},
{type: "B", "object": {}},

这就是我想要的:

{type: "A", object: {a: "", b: "foo"}},
{type: "A", object: {a: "", b: "bar"}},
{type: "A", object: {b: "bar"}},
{type: "B"}

我们将非常感谢您的帮助。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    此聚合查询将为您提供所需的结果:

    db.collection.aggregate([
    {
        $addFields: {
            object: {
                $cond: {
                    if: { $eq: [ "$type", "A" ] },
                    then: { 
                        $mergeObjects: [ 
                            "$object",  
                            { b: { $ifNull: [ "$object.b", "bar" ] } } 
                        ] 
                    },
                    else: "$$REMOVE"
                }
            }
        }
    }
    ])
    

    注意$$REMOVE 是一个聚合系统变量。

    【讨论】:

    • 如果{type : "B", object {...}} 这将删除需要修复的对象。如果/否则我认为需要一个代替“$$REMOVE”
    【解决方案2】:

    $set 添加路径时,会添加所有路径,即使您最终到了$$REMOVE,这只会影响路径的最后一个,其余的将已经添加see example

    查询

    • $set 开关盒从对象开始
    • 如果对象不存在
      • 如果类型A添加{object :{"b" : "bar"}}
      • 否则$$REMOVE
    • $type = "A" AND (非值 "$object.b")
      添加{"b" : "bar"}(此案例也涵盖案例对象:null)
    • 其他
      保留旧值(另一种类型,或 b 有值)

    *也许它可能会更小,但我们会检查很多东西(请参阅所有数据案例的示例)

    • 对象存在/空/不存在
    • A 型/不是
    • b 存在/空/值

    Test code here

    db.collection.aggregate([
      {
        "$set": {
          "object": {
            "$switch": {
              "branches": [
                {
                  "case": {
                    "$eq": [
                      {
                        "$type": "$object"
                      },
                      "missing"
                    ]
                  },
                  "then": {
                    "$cond": [
                      {
                        "$eq": [
                          "$type",
                          "A"
                        ]
                      },
                      {
                        "b": "bar"
                      },
                      "$$REMOVE"
                    ]
                  }
                },
                {
                  "case": {
                    "$and": [
                      {
                        "$eq": [
                          "$type",
                          "A"
                        ]
                      },
                      {
                        "$or": [
                          {
                            "$eq": [
                              "$object.b",
                              null
                            ]
                          },
                          {
                            "$eq": [
                              {
                                "$type": "$object.b"
                              },
                              "missing"
                            ]
                          }
                        ]
                      }
                    ]
                  },
                  "then": {
                    "$mergeObjects": [
                      "$object",
                      {
                        "b": "bar"
                      }
                    ]
                  }
                }
              ],
              "default": "$object"
            }
          }
        }
      }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2020-02-02
      • 2019-09-24
      • 2013-11-18
      • 2016-10-24
      相关资源
      最近更新 更多