如何在update语句中使用变量-MongoDB

如何在update语句中使用变量-MongoDB,mongodb,robo3t,Mongodb,Robo3t,我试图使用变量值作为列名来更新集合中的所有文档。我正在通过机器人mongo shell命令进行尝试。 代码如下: doc=db.Symbols.findOne(); for (key in doc) { db.getCollection('Symbols').update( { key : null }, { $set: { key: ""} }, { multi: true, upsert: false } ) } 但是这个代码似乎不适合我

我试图使用变量值作为列名来更新集合中的所有文档。我正在通过机器人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可以批量更新集合,而不是针对每个文档发送更新请求,从而使更新更快、更高效。以下示例使用方法演示了这一点:

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

您是否检查了@yogesh?我关心的不是更改列名,而是用空字符串更新包含null的所有列值。这是一个javascript问题,它将
视为字符串文字。您需要在外部手动形成数组,如
crtiera[key]=null
,然后使用它