我想要做的事情非常简单,但我无法找到如何给一个字段赋予另一个字段的价值。
我只是想用一个字段计数更新一个字段。
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"}}})
答案 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" }
答案 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)
您正在以错误的方式使用exists
Syntax: { field: { $exists: <boolean> } }
您使用$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来做你想做的事。