首页 > 解决方案 > 为什么我需要指定 $switch 默认语句,而它是可选的?

问题描述

我想用条件更新文件。我尝试了 $cond,但它需要一个用于错误案例的表达式。如果它是假的,我不想更新任何东西。以下是该文件的样本:

{
    "_id" : ObjectId("5bc29e0d0fc2c40a9d628afe"),
    "BasicInfo" : {
        "RepNo" : "AE179",
        "CompanyName" : "First Bancshares Inc",
        "IRSNo" : "640862173",
        "CIKNo" : "0000947559",
        "Name" : "Ordinary Shares",
        "Ticker" : "FBMS",
        "CUSIP" : "318916103",
        "ISIN" : "US3189161033",
        "RIC" : "FBMS.O",
        "SEDOL" : "2184300",
        "DisplayRIC" : "FBMS.OQ",
        "InstrumentPI" : "10552665",
        "QuotePI" : "26300255",
        "Exchange" : "NASDAQ"
    },
    "Annual" : {
        "Date" : ISODate("2017-12-31T00:00:00.000Z"),
        "INC" : {
            "SIIB" : {
                "Description" : "Interest Income, Bank",
                "Value" : 66.06941
            },
            "STIE" : {
                "Description" : "Total Interest Expense",
                "Value" : 6.90925
            },
            "ENII" : {
                "Description" : "Net Interest Income",
                "Value" : 59.16016

然后,我尝试使用 $switch ,因为文档说默认语句是可选的。

我写了以下代码:

db.getCollection('FinancialStatement').aggregate([
{"$unwind":"$Annual"},
{"$addFields":{"Annual.Price":
    {"$switch":{
        branches:[
        {
            case: {
                "$and":[
                {"$eq":["$_id", ObjectId("5bc29e0d0fc2c40a9d628afe")]}, 
                {"$eq":["$Annual.Date", ISODate("2017-12-31 00:00:00.000Z")]}
                ]
        },
        then: 1000}
    ],
        default: -2000
        }
        }
        }
}
]
)

如果满足 objectID 和 date 要求,它基本上会添加一个名为 Annual.price 的新字段。但是,如果我省略了默认语句,程序会返回一条错误消息:

Assert: command failed: {
    "ok" : 0,
    "errmsg" : "$switch could not find a matching branch for an input, and no default was specified.",
    "code" : 40066,
    "codeName" : "Location40066"
}

标签: mongodbaggregation-framework

解决方案


来自关于使用的文档default

可选的。如果没有分支案例表达式计算为真,则采用的路径。

尽管是可选的,但如果未指定默认值并且没有分支案例评估为真,则 $switch 返回错误。

$$REMOVE在 3.6 中使用。

就像是

使用$cond

{"$addFields":{
  "Annual.Price":{
    "$cond":[
        {
          "$and":[
            {"$eq":["$_id",ObjectId("5bc29e0d0fc2c40a9d628afe")]},
            {"$eq":["$Annual.Date",ISODate("2017-12-31 00:00:00.000Z")]}
          ]
        },
      1000,
      "$$REMOVE"
    ]
  }
}}

使用$switch

{"$addFields":{
  "Annual.Price":{
    "$switch":{
      "branches":[
        {
          "case":{
            "$and":[
              {"$eq":["$_id",ObjectId("5bc29e0d0fc2c40a9d628afe")]},
              {"$eq":["$Annual.Date",ISODate("2017-12-31 00:00:00.000Z")]}
            ]
          },
          "then":1000
        }
      ],
      "default":"$$REMOVE"
    }
  }
}} 

推荐阅读