【问题标题】:How to "(WHERE) column = column" in Mongo?如何在 Mongo 中“(WHERE)column = column”?
【发布时间】:2017-07-09 21:09:35
【问题描述】:

我喜欢 Mongo 做一些简单的事情,所以我希望用它做一些更高级的事情。在我需要这个之前效果很好:

UPDATE tbl SET a = b WHERE c <> 0

a = b 部分是我无法弄清楚的。我试过 mongodb.org,但在那里找不到。我也找了WHERE a = b,但我也找不到。

另一种方法是获取所有行,而不是单独更新它们,但我不喜欢这样。它必须更简单。

谢谢。

【问题讨论】:

    标签: mongodb nosql


    【解决方案1】:

    您想查看更新文档。
    http://www.mongodb.org/display/DOCS/Updating

    您的代码可能如下所示:
    db.tbl.update( { c:{$ne:0}}, { $set: { a : b } } );

    如果您需要复习高级查询(例如使用$ne),请查看此处:
    http://www.mongodb.org/display/DOCS/Advanced+Queries

    编辑:
    显然您无法使用同一文档中的数据进行更新。
    MongoDB: Updating documents using data from the same document

    EDIT 2(使用 map reduce 的解决方案)

    var c = new Mongo();
    var db = c.getDB('db')
    var s = db.getCollection('s')
    s.drop();
    s.save({z:1,q:5});
    s.save({z:11,q:55});
    
    db.runCommand({
    mapreduce:'s',
    map:function(){
      var i = this._id; //we will emit with a unique key. _id in this case
      this._id=undefined; //strange things happen with merge if you leave the id in
      //update your document with access to all fields!
      this.z=this.q;
    
      emit(i,this);
    }, 
    query:{z:1},    //apply to only certain documents
    out:{merge:'s'} //results get merged (overwrite themselves in collection)
    });
    
    //now take a look
    s.find();
    

    【讨论】:

    • $ne 不是问题所在。 a = b 是。您将值b 分配给a 列。我想将b 列的值分配给a 列。不是SET a = 'b',而是SET a = b
    • 我已经编辑了我的答案。显然update 无法引用当前文档。我认为可以使用 map-reduce 来完成。正在研究发布的解决方案...
    • @Rudie:使用 map/reduce 解决方案再次更新。
    • 获取所有匹配记录并单独更新它们有什么优势?您的解决方案是单笔交易? (如果这在 Mongo 中甚至是一件事。)我真的不明白地图减少和发射。我会检查文档。谢谢你的例子!
    • 据此,map & reduce 运行在服务器上。 mongodb.org/display/DOCS/MapReduce#MapReduce-Overview
    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多