我正在尝试执行一个非常简单的脚本,以从文档中删除所有空值。该文档具有以下结构:

{ "_id" : ObjectId("5a75caa4ce7a49e7d8474a40"),
"icao" : "MLA",
"name" : "40-Mile Air",
"callsign" : "MILE-AIR",
"country" : "US",
"alid" : 10,
"mode" : "F",
"active" : "Y",
"routes" : [ { "codeshare" : "",
    "dst_ap" : "TKJ",
    "dst_apid" : 7235,
    "equipment" : "CNA",
    "rid" : 46585 } ]


我正在执行的脚本是这样的:

db.airlines.updateMany(
{ codeshare: "" },
{ $unset: {codeshare : 1}},
)


但是,运行后出现此错误:

2018-02-07T10:17:35.634+0000 E QUERY    [thread1] SyntaxError: missing : after property id @(shell):3:21

最佳答案

在更新中将$unset运算符与$ positional operator一起应用以删除嵌入的codeshare字段。

$ positional operator将在不显式指定数组中元素位置的情况下标识要更新的数组中正确的元素,因此您的最终update语句应类似于:

db.airlines.updateMany(
    { "routes.codeshare": "" },
    { "$unset": { "routes.$.codeshare": 1 } }
)




对于数组中的多个元素,请使用过滤后的位置运算符$[<identifier>]来标识与arrayFilters条件匹配的数组元素:

db.airlines.updateMany(
   { "routes.codeshare": "" },
   { "$unset": { "routes.$[element].codeshare" : 1 } },
   { "arrayFilters": [ { "element.codeshare": "" } ] }
)

10-05 21:11
查看更多