MongoDB更新.试图从另一个属性设置一个字段

jwi*_*720 7 mongodb

我想要做的事情非常简单,但我无法找到如何给一个字段赋予另一个字段的价值.

我只想用另一个字符计数更新一个字段.

db.collection.update({$exists:true},{$set : {field1 : field2.length}})
Run Code Online (Sandbox Code Playgroud)

我试过给它点符号

db.collection.update({$exits:true},{$set : {field1: "this.field2.length"}})
Run Code Online (Sandbox Code Playgroud)

以及使用javascript语法

db.collection.update({$exits:true},
                     {$set : {field1: {$where : "this.field2.length"}})
Run Code Online (Sandbox Code Playgroud)

但只是复制了字符串并分别获得了"notOkforstorage".有帮助吗?

更新:当我按ID查询时,我只获得"notOkforStorage":

db.collection.update({_id:ObjectID("38289842bbb")},
                     {$set : {field1: {$where :"this.field2.length"}}})
Run Code Online (Sandbox Code Playgroud)

Leo*_*tny 16

请尝试以下代码:

db.collection.find(your_querry).forEach(function(doc) {
  doc.field1 = doc.field2.length;
  db.collection.save(doc);
});
Run Code Online (Sandbox Code Playgroud)

您可以使用your_querry仅选择原始集合的一部分来执行更新.如果要处理整个集合,请使用your_querry = {}.

如果您希望所有操作都是原子操作,请使用update而不是save:

db.collection.find( your_querry, { field2: 1 } ).forEach(function(doc) {
  db.collection.update({ _id: doc._id },{ $set: { field1: doc.field2.length } } );
});
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 8

开始Mongo 4.2db.collection.update()可以接受聚合管道,最后允许基于另一个字段更新/创建一个字段:

// { "_id" : ObjectId("5e84c..."), "field1" : 12, "field2" : "world" }
db.collection.update(
  { "_id" : ObjectId("5e84c...") },
  [{ $set: { field1: { $strLenCP: "$field2" } } }]
)
// { "_id" : ObjectId("5e84c..."), "field1" : 5, "field2" : "world" }
Run Code Online (Sandbox Code Playgroud)
  • 第一部分{}是匹配查询,过滤要更新的文档。

  • 第二部分[{ $set: { field1: { $strLenCP: "$field2" } } }]是更新聚合管道(注意方括号表示使用聚合管道)。$set是一个新的聚合运算符和$addFields. 任何聚合运算符都可以在$set阶段内使用;在我们的例子中$strLenCP,它提供了field2.

  • 这应该是正确的答案。每个“doc”上的“forEach”都太慢了。 (2认同)