代码之家  ›  专栏  ›  技术社区  ›  Clauric

MongoDB带条件的updateMany

  •  1
  • Clauric  · 技术社区  · 5 年前

    我有一个很大的数据库,有各种不一致的地方。我想澄清的一件事是根据人口改变国家地位。

    { "_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" }
    

    很明显,我想根据人口规模,改变农村地区的格局。

    我尝试过这种方法,但很明显,我错过了一些与国家领域的最新情况相关的方法。

    db.country.updateMany( { case : { $lt : ["$pop" : 20000000] }, then : "Small country" }, { case : { $gte : ["$pop" : 20000000] }, then : "Large country" }
    

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

    我想用 $cond

    这是可能的,还是有解决办法?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Neil Lunn    5 年前

    你真的想要 bulkWrite() 使用两个 "updateMany" 而不是里面的陈述。聚合表达式不能用于以任何形式的update语句执行“替代选择”。

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

    SERVER-6566 对于“条件语法”,但这尚未解决。“bulk”API实际上是在提出这个请求之后引入的,实际上可以是 改编 或多或少 同样的事情。

    $out 在聚合语句中,不可以选择 “更新” 美元 “更新” 现有的集合, 然而 只有当要更新的集合不同于从聚合管道收集数据时使用的任何其他集合时,才会出现这种情况。所以 使用聚合管道 更新 相同的 就像你读的一样。

    bulkWrite() .