mongodb - 为什么我需要指定 $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"
}
解决方案
来自关于使用的文档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"
}
}
}}
推荐阅读
- python-3.x - 如何使用 findall() 匹配在字符串中重复 n 次的模式?
- android - 通过 SmsManager 发送短信时应用程序崩溃
- sql - 返回计数最高的行(如交易最多的城市,当有多个城市时)
- git - 如何将值传递给 Gitlab CI 作业
- paperjs - 如何在 Paper.js 中划分多个形状,例如在 Illustrator 中使用 Pathfinder
- angular - 即使 tsc 版本足够高,也不会构建带有 bang 运算符的打字稿文件
- java - 为什么在 Google Play 商店上传应用程序时出现 SslErrorHandler?
- php - Laravel 单元测试的 PDO 扩展
- python - 如何使用 django-siteflags 为站点对象添加书签?
- php - 用于计算常见贷款类型(如抵押贷款、汽车贷款、学生贷款或个人贷款)的基本计算公式