如何在update语句中使用变量-MongoDB
我试图使用变量值作为列名来更新集合中的所有文档。我正在通过机器人mongo shell命令进行尝试。 代码如下:如何在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 } ) } 但是这个代码似乎不适合我
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
,然后使用它