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

时间:2012-12-23 05:29:06

标签: mongodb

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

我只是想用一个字段计数更新一个字段。

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 个答案:

答案 0 :(得分:16)

请尝试以下代码:

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 } } );
});

答案 1 :(得分:3)

Mongo 4.2开始,db.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

答案 2 :(得分: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);

答案 3 :(得分:-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; } } );

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