【问题标题】:how to use variable in update statement - MongoDB如何在更新语句中使用变量 - MongoDB
【发布时间】:2016-12-15 23:40:23
【问题描述】:

我正在尝试使用变量值作为列名来更新集合中的所有文档。我正在通过 robo mongo shell 命令尝试此操作。 代码如下:

doc=db.Symbols.findOne();
for (key in doc) 
{
db.getCollection('Symbols').update(
   { key : null },
   {
        $set: { key: ""} 
   },
   { multi: true, upsert: false }
)
    }

但这段代码似乎对我不起作用。似乎变量“key”中的值在运行时不会替换,而不是与变量 key robo mongo 中的值进行比较,而是将其与单词“key”本身进行比较。 知道怎么做吗?

【问题讨论】:

  • 你检查了吗$rename
  • @yogesh- 我关心的不是更改列名,而是用空字符串更新所有包含 null 的列值。
  • 这是一个javascript的东西,它将key视为字符串文字。您需要像crtiera[key] = null 一样在外面手动形成数组,然后使用它

标签: mongodb robo3t


【解决方案1】:

您需要一种机制来遍历整个集合,并在每次迭代时检查文档中的每个字段是否为空,并相应地更新集合。基本方法如下:

db.Symbols.find({}).forEach(function(doc){
    var update = { "$set": { } },
        query = {};
    for (var key in doc) {
        if (doc[key] === null) {
            update["$set"][key] = "";
            query[key] = { "$exists": false }
        }            
    }
    if (Object.keys(query).length !=== 0) 
        db.Symbols.updateOne(query, update);        

});

对于非常庞大的集合,您可以利用批量 API 提高更新效率,该 API 可以批量更新您的集合,而不是按文档发送更新请求,从而使更新更快、性能更高。以下示例使用 bulkWrite() 方法演示了这一点:

var ops = [];

db.Symbols.find({}).forEach(function(doc){
    var update = { "$set": { } },
        query = {};
    for (var key in doc) {
        if (doc[key] === null) {
            update["$set"][key] = "";
            query[key] = { "$exists": false }
        }            
    }
    if (Object.keys(query).length !=== 0) {
        ops.push({
            "updateOne": {
                "filter": query,
                "update": update
            }
        });
    }


    // Send to server in batches of 500 operations only
    if (ops.length % 1000 === 0) {
        db.Symbols.bulkWrite(ops);
        ops = [];
    }
})

// Clear remaining queue
if (ops.length > 0)
    db.Symbols.bulkWrite(ops);

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2017-12-21
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多