15

我正在尝试做的事情非常简单,但我不知道如何为一个字段赋予另一个字段的值。

我只是想用另一个字段的字符数更新一个字段。

db.collection.update({$exists:true},{$set : {field1 : field2.length}})

我试过给它点符号

db.collection.update({$exits:true},{$set : {field1: "this.field2.length"}})

以及使用 javascript 语法

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

但只是复制了字符串并分别得到了一个“notOkforstorage”。有什么帮助吗?

更新:当我通过 ID 查询时,我只得到“notOkforStorage”:

db.collection.update({_id:ObjectID("38289842bbb")},
                     {$set : {field1: {$where :"this.field2.length"}}})
4

4 回答 4

26

试试下面的代码:

db.collection.find(your_querry).forEach(function(doc) {
  doc.field1 = doc.field2.length;
  db.collection.save(doc);
});

您可以使用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 } } );
});
于 2012-12-23T09:41:25.830 回答
10

开始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" }
  • 第一部分{}是匹配查询,过滤要更新的文档。

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

于 2020-04-01T16:45:26.080 回答
0

据我所知,最简单的方法是读写方法:

//At first, get/prepare your new value:
var d= db.yourColl.fetchOne({....});
d.field1== d.field2.length;

// then update with your new value
db.yourColl.save(d);
于 2012-12-23T09:46:44.387 回答
-1
  1. 您的使用exists方式错误。
    Syntax: { field: { $exists: <boolean> } }

  2. 您使用$where也不正确
    使用 $where 运算符将包含 JavaScript 表达式的字符串或完整的 JavaScript 函数传递给查询系统

    db.myCollection.find( { $where: "this.credits == this.debits" } ); db.myCollection.find( { $where: "obj.credits == obj.debits" } );

    db.myCollection.find( { $where: function() { return (this.credits == this.debits) } } );

    db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );

我认为你应该使用Map-Reduce来做你想做的事情。

于 2012-12-23T08:55:03.063 回答