MongoDB:使用 $concat 更新字段值的问题

Ali*_*ena 5 concatenation mongodb

我正在尝试通过将 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]}}} 
    )
});
Run Code Online (Sandbox Code Playgroud)

返回结果是:

The dollar ($) prefixed field '$concat' in 'field_1.$concat' is not valid for storage.
Run Code Online (Sandbox Code Playgroud)

我确定我没有正确编写 $concat 命令,有什么办法可以做到这一点吗?

Sna*_*dex 7

$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 } }
    )
   });
Run Code Online (Sandbox Code Playgroud)


Rat*_*mar 6

为了使用另一个字段的值更新 MongoDB 字段,MongoDB 版本 4.2还引入了 $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);
Run Code Online (Sandbox Code Playgroud)

  • 无需使用耗时的循环过程 (2认同)