在过去的几天里,我一直在做一些研究,以找到答案,但没有运气.:(
我有一个文件,其中包含一个包含很长字符串的字段.我需要将另一个字符串连接到字段中已包含的字符串的末尾.
我现在这样做的方式是,从Java中,我获取文档,在字段中提取字符串,将字符串追加到末尾,最后用新字符串更新文档.
问题:字段中包含的字符串非常长,这意味着在Java中检索和使用此字符串需要时间和资源.此外,这是每秒进行几次的操作.
我的问题:有没有办法将字符串连接到现有字段,而不必首先获取(db.<doc>.find())字段的内容?实际上我想要的只是(field.contents += new_string).
我已经使用Javascript完成了这项工作eval,但是正如我发现的那样,MongoDB在执行javascript时会锁定数据库,这会使整个应用程序变得更慢.
先感谢您.:)
Xav*_*hot 27
开始Mongo 4.2,db.collection.update()可以接受聚合管道,最后允许根据其当前值更新字段:
// { a: "Hello" }
db.collection.update(
{},
[{ $set: { a: { $concat: [ "$a", "World" ] } } }],
{ multi: true }
)
// { a: "HelloWorld" }
Run Code Online (Sandbox Code Playgroud)
第一部分{}是匹配查询,过滤要更新的文档(在本例中为所有文档)。
第二部分[{ $set: { a: { $concat: [ "$a", "World" ] } } }]是更新聚合管道(注意方括号表示使用聚合管道)。$set(alias of $addFields) 是一个新的聚合运算符,在这种情况下它替换字段的值(通过将a自身与后缀连接起来"World")。请注意如何a直接根据其自身的值 ( $a) 进行修改。
不要忘记{ multi: true },否则只会更新第一个匹配的文档。
Iur*_*ilo 21
例如(它附加到开头,同样的故事):
之前
{"_ id":ObjectId("56993251e843bb7e0447829d"),"name":"伦敦城市","城市":"伦敦"}
db.airports
.find( { $text: { $search: "City" } })
.forEach(
function(e, i){
e.name='Big ' + e.name;
db.airports.save(e);
}
)
Run Code Online (Sandbox Code Playgroud)
后:
{"_ id":ObjectId("56993251e843bb7e0447829d"),"name":"Big London City","city":"London"}
老话题,但我有同样的问题。从 mongo 2.4 开始,您可以使用聚合框架中的$concat。
例子
考虑这些文件:
{
"_id" : ObjectId("5941003d5e785b5c0b2ac78d"),
"title" : "cov"
}
{
"_id" : ObjectId("594109b45e785b5c0b2ac97d"),
"title" : "fefe"
}
Run Code Online (Sandbox Code Playgroud)
附加fefe到title字段:
db.getCollection('test_append_string').aggregate(
[
{ $project: { title: { $concat: [ "$title", "fefe"] } } }
]
)
Run Code Online (Sandbox Code Playgroud)
聚合的结果将是:
{
"_id" : ObjectId("5941003d5e785b5c0b2ac78d"),
"title" : "covfefe"
}
{
"_id" : ObjectId("594109b45e785b5c0b2ac97d"),
"title" : "fefefefe"
}
Run Code Online (Sandbox Code Playgroud)
然后您可以批量保存结果,请参阅此答案。
| 归档时间: |
|
| 查看次数: |
13288 次 |
| 最近记录: |