MongoDB updateMany 有条件

Cla*_*ric 3 mongodb mongodb-query

我有一个很大的数据库,存在各种不一致的情况。我想澄清的项目之一是根据人口改变国家地位。

数据样本是:

{ "_id" : "D", "name" : "Deutschland", "pop" : 70000000, "country" : "Large Western" }
{ "_id" : "E", "name" : "Eire", "pop" : 4500000, "country" : "Small Western" }
{ "_id" : "G", "name" : "Greenland", "pop" : 30000, "country" : "Dependency" }
{ "_id" : "M", "name" : "Mauritius", "pop" : 1200000, "country" : "Small island"}
{ "_id" : "L", "name" : "Luxembourg", "pop" : 500000, "country" : "Small Principality" }
Run Code Online (Sandbox Code Playgroud)

显然,我想根据人口规模将国家/地区字段更改为更加统一的内容。

我已经尝试过这种方法,但显然缺少某种与国家/地区字段更新联系起来的方法。

db.country.updateMany( { case : { $lt : ["$pop" : 20000000] }, then : "Small country" }, { case : { $gte : ["$pop" : 20000000] }, then : "Large country" }
Run Code Online (Sandbox Code Playgroud)

编辑:在我写完之前发布。

我正在考虑使用$cond功能,基本上返回如果 true,则执行 X,如果 false,则执行 y,同时使用 updateMany。

这可能吗,或者有解决方法吗?

Nei*_*unn 5

您确实希望在其中bulkWrite()使用两个语句。"updateMany"聚合表达式不能用于任何形式的更新语句中进行“交替选择”。

db.country.bulkWrite([
  { "updateMany": {
    "filter": { "pop": { "$lt": 20000000 } },
    "update": { "$set": { "country": "Small Country" } }
  }},
  { "updateMany": {
    "filter": { "pop": { "$gt": 20000000 } },
    "update": { "$set": { "country": "Large Country" } } 
  }}
])
Run Code Online (Sandbox Code Playgroud)

SERVER-6566上仍然存在一个未解决的“条件语法”“功能请求”,但这尚未解决。“批量”API 实际上是在提出此请求后引入的,并且确实可以如图所示进行调整以执行或多或少相同的操作。

另外,按照其他建议在聚合语句中使用也不是“更新”$out选项,目前只能写入“新集合”。从 MongoDB 4.2 开始的预定更改将允许实际“更新”现有集合,但这仅适用于要更新的​​集合与从聚合管道收集数据时使用的任何其他集合不同的情况。因此,不可能使用聚合管道来更新与您正在读取的内容相同的集合。$out

简而言之,使用bulkWrite().