gpt4 book ai didi

javascript - 高效查找和替换文档中的字符串

转载 作者:IT老高 更新时间:2023-10-28 13:24:36 27 4
gpt4 key购买 nike

我有以下查询,在名称字段中查找   标记并将它们替换为空白 - 以摆脱它们。
名称字符串可以有 1 到多个   标签,例如

AA aa
AA  aa
AA   aa
AA    aa
AA AA aaaaaaaa

……就这样。

  db.tests.find({'name':/.* .*/}).forEach(function(test){
test.name = test.name.replace(" ","");
db.tests.save(test);
});

db.tests.find({'name':/.*  .*/}).forEach(function(test){
test.name = test.name.replace("  ","");
db.tests.save(test);
});

db.tests.find({'name':/.*   .*/}).forEach(function(test){
test.name = test.name.replace("   ","");
db.tests.save(test);
});

除了重复相同的查询模式之外,是否有更好的解决方案来处理这种情况,以减少重复并提高性能?

最佳答案

当然,如果您只想从文本中删除   实体,那么您只需进行全局匹配并替换:

db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});

所以不需要写出每个组合,正则表达式将用 /g 选项替换非常匹配。多行也可能使用 /m 是您的“名称”字符串包含换行符。见基本 regexer example .

也推荐使用$set为了只修改您真正想要的字段,而不是 .save() 整个文档。自读取文档以来,流量减少,覆盖可能由另一个进程进行的更改的可能性也较小。

理想情况下,您应该将批量操作 API 与 MongoDB 版本 2.6 及更高版本一起使用。这允许“批量”更新,因此客户端和服务器之间的流量再次减少:

var bulk = db.tests.initializeOrderedBulkOp();
var count = 0;

db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
bulk.find({ "_id": doc._id })
.updateOne({ "$set": { "name": doc.name } });
count++;

if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.tests.initializeOrderedBulkOp();
}
});

if ( count % 1000 != 0 )
bulk.execute();

这些是您改善这一点的主要方法。不幸的是,MongoDB 更新语句无法以这种方式将现有值用作其更新表达式的一部分,因此唯一的方法是循环,但您可以做很多事情来减少所示的操作。

关于javascript - 高效查找和替换文档中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28866930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com