MongoDB:使用$concat更新字段值时出现问题

7
我将尝试通过将文本与字符串连在一起来更新MongoDB集合中字段的值。此外,该字段是一个整数,我想在其前面添加“0”,以便它变成一个字符串。
据我所知,我不能在单个更新指令中使用该字段的旧值,因此我正在使用forEach()方法。
以下是代码:
db.col_1.find({"field_1": {$lt: 10000}}).forEach( function(i){
  db.col_1.update({_id: i._id},
    {$set: { "field_1": {$concat: ["0", i.field_1]}}} 
    )
});

返回的结果是:
The dollar ($) prefixed field '$concat' in 'field_1.$concat' is not valid for storage.

我确定我没有正确使用$concat命令,有没有办法解决这个问题?


1
尝试使用 {$set: { "field_1": "0" + i.field_1 } } - chridam
1
$concat 只能在聚合查询中使用。 - felix
@chridam -- 这样已经完美地运行了,非常感谢! - Aliena
回答已发布。如果您喜欢我的努力,请批准并点赞我的答案。 - Ratan Uday Kumar
3个回答

10

$concat是一个聚合管道,而不是更新操作符/修饰符。

看起来你想要做的事情可以通过以下方法实现:

db.col_1
  .find({ "field_1": { $lt: 10000 } })
  .forEach( function(i) {
    db.col_1.update(
      { _id: i._id },
      { $set: { "field_1": "0" + i.field_1 } }
    )
   });

6

在MongoDB版本4.2中,为了使用另一个字段的值更新MongoDB字段,还引入了$set管道阶段运算符,它是$addFields的别名。你可以在此处使用$set,因为它与我们正在尝试实现的内容相匹配。

let query = {
    "field_1": {
        $lt: 10000
    }
};
let changes = {
    $set: {
        "field_1": {
            "$concat": ["0", "$field_1"]
        }
    }
};
let UpdatedStatus = await col_1.updateMany(query, [changes]).lean();
console.log(UpdatedStatus);

2
无需使用耗时的循环过程。 - Ratan Uday Kumar
1
我不知道我们可以像聚合操作一样在更新操作中使用管道,我了解越多MongoDB就越喜欢它! - Paulo Marcio
这样做不行,你不能在插入/更新语句中使用$concat。 - CiccioMiami
1
从版本4.2开始,您可以在更新中使用聚合运算符,并使用数组[]中的更改,而不是对象{}。 - Ratan Uday Kumar
1
这绝对是最好的选择。谢谢。您还解决了需要通过“[ ]”括号传递“change”部分的问题。请注意,您还可以将“toString”添加到联系选项中:“$concat”:[value,“_”,{“$toString”:“$_id”}]。 - Rea Haas

2
如果你想要使用 $concat 和 $set,这里还有另一种方法:
db.col_1.updateMany(
    {"field_1": {$lt: 10000}},
    [
        { $set: { "field_1": {$concat: ["0", "$field_1"]} } }
    ]
 )

你不需要使用forEach。通过updateMany,你可以轻松修改所有符合查询条件{"field_1": {$lt: 10000}}的文档。

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