将字符串附加到MongoDB中现有字段的末尾

pic*_*ico 14 mongodb

在过去的几天里,我一直在做一些研究,以找到答案,但没有运气.:(

我有一个文件,其中包含一个包含很长字符串的字段.我需要将另一个字符串连接到字段中已包含的字符串的末尾.

我现在这样做的方式是,从Java中,我获取文档,在字段中提取字符串,将字符串追加到末尾,最后用新字符串更新文档.

问题:字段中包含的字符串非常长,这意味着在Java中检索和使用此字符串需要时间和资源.此外,这是每秒进行几次的操作.

我的问题:有没有办法将字符串连接到现有字段,而不必首先获取(db.<doc>.find())字段的内容?实际上我想要的只是(field.contents += new_string).

我已经使用Javascript完成了这项工作eval,但是正如我发现的那样,MongoDB在执行javascript时会锁定数据库,这会使整个应用程序变得更慢.

先感谢您.:)

Xav*_*hot 27

开始Mongo 4.2db.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 },否则只会更新第一个匹配的文档。

  • 关于“注意方括号表示使用聚合管道”的特别说明 (3认同)

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"}


Oli*_*adé 5

老话题,但我有同样的问题。从 mongo 2.4 开始,您可以使用聚合框架中的$concat

例子

考虑这些文件:

{
    "_id" : ObjectId("5941003d5e785b5c0b2ac78d"),
    "title" : "cov"
}

{
    "_id" : ObjectId("594109b45e785b5c0b2ac97d"),
    "title" : "fefe"
}
Run Code Online (Sandbox Code Playgroud)

附加fefetitle字段:

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)

然后您可以批量保存结果,请参阅此答案


Dhr*_*hak 0

这是不可能的。您可以做的一项优化是创建批量更新。即获取 10K 文档,将相关字符串附加到每个键,然后将它们保存为单个批次。大多数 mongodb 驱动程序都支持批处理操作。