mongodb - 如何在更新语句中使用变量 - MongoDB

标签 mongodb robo3t

我正在尝试使用变量值作为列名来更新集合中的所有文档。我正在通过 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”本身进行比较。 知道如何做到这一点吗?

最佳答案

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

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);

关于mongodb - 如何在更新语句中使用变量 - MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41167372/

相关文章:

node.js - 显示消息所有者

python - 在 MongoDB 的客户端 pymongo 中编写查询,将字符串的一部分动态转换为日期

MongoDB 4.2.1-updateMany : Error: the update operation document must contain atomic operators

mongodb - 如何将 mongo 中的特定查询导出到 csv?

python - Pymongo 读取比 mongo 客户端(robomongo)慢得多

javascript - Mongodb 查看数组中的所有项目是否存在并更新,否则插入

mongodb - Docker 无法在内部将服务名称转换为 IP 地址

javascript - 如何“等待”(或.then())一个异步函数,但该函数包装在模块中并且不返回Promise

mongodb - RoboMongo 0.8.5 错误插入日期

MongoDB 聚合 : multiple group + elements array