MongoDB:使用另一个字段的值更新字段

10

我正在使用Mongo shell,尝试为集合中的所有文档添加一个与现有字段相同值的字段。假设我们有两个文档:

{
   'foo': 'str1'
}

并且

{
   'foo': 'str2'
}

我想插入一个新的字段'foo_new',并将其值设置为'foo'的值,使文档变成:
{
   'foo': 'str1'
   'foo_new': 'str1'
}

并且

{
   'foo': 'str2'
   'foo_new': 'str2'
}

我使用的命令在Mongo shell中更新集合(例如'coll')的语法如下:
db.coll.update({}, {$set: {'foo_new': '$foo'}}, {multi: true})

运行此命令后,会得到两个更新后的文档。
{
   'foo': 'str1'
   'foo_new': '$foo'
}

并且

{
   'foo': 'str2'
   'foo_new': '$foo'
}

'$foo' 由于某些原因被解释为字面量。


这个回答解决了你的问题吗?如何在MongoDB中使用另一个数字字段更新数字字段 - whoami - fakeFaceTrueSoul
@whoami:理论上是可以的。这正是我尝试过的,但我的Mongo shell会将“$a”解释为字符串“$a”,而不是2,即键为'a'的字段的值。 - John S.
1
S:你尝试的方法和必须完成的任务有所不同,.update() 应该在聚合管道中 :: [ ] 而不是作为一个对象!你的 MongoDB 版本是多少? - whoami - fakeFaceTrueSoul
@whoami: 我也尝试将更新放在方括号中。不幸的是,仍然存在同样的问题。MongoDB 服务器版本:4.0.16 - John S.
聚合管道(Aggregation pipeline)在.updates()中仅适用于MongoDB v> = 4.2,正如答案中所述。如果使用低于该版本的版本,则需要先读取数据,然后再写回数据库。或者使用聚合管道来完全创建具有所需数据的不同集合,并删除现有的集合。如果您可以接受这一点,我可以提供一个查询。 - whoami - fakeFaceTrueSoul
1
@whoami:感谢你指出来!我会采取读写回传的方法,但还是谢谢你提供查询。 - John S.
1个回答

20

https://stackoverflow.com/questions/60418883/how-to-update-a-number-field-using-another-number-field-in-mongodb - whoami - fakeFaceTrueSoul
如果我们创建了一个新文档,是否可以使新字段自动填充此值?有什么方法可以实现这一点吗?我基本上要根据另外2个字段进行计算。如果我们添加一个新文档,计算是否会反映在新字段中? - pranav
1
这不是Mongo 4.0的有效解决方案。 - Kane
1
顺便说一句,我遇到了同样的问题,但不需要添加 {"multi": true} 部分,只需在我的设置条件周围添加方括号即可解决问题。 - Major Major

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接