2016-03-10 62 views
2

我试图运行一个mongo查询来更新一个字段的值与另一个字段的值。我有以下文件:mongodb更新字段a是字段b的值

{ "_id" : ObjectId("56e0a3a2d59feaa43fba49d5"), "old" : 16, "new" : 17 } 

{ "_id" : ObjectId("56e0a3a2d59feaa43fba49d3"), "old" : 11, "new" : 12 } 

我想使它看起来像此更新后:

{ "_id" : ObjectId("56e0a3a2d59feaa43fba49d5"), "old" : 16, "new" : 16 } 

{ "_id" : ObjectId("56e0a3a2d59feaa43fba49d3"), "old" : 11, "new" : 11 } 

我已经试过,没有运气以下

db.runCommand(
{ 
findAndModify: "testData", 
query: { $where: "this.new != this.old" }, 
update: { old : this.new }, 
upsert: true 
} 
) 

db.testData.update({ $where: "this.new != this.old" }, { $set: { old: this.new } }); 

这是偶数po可以用mongoDb吗?

我想在单个查询中执行此操作,而不是遍历每个文档。

任何想法将不胜感激。

谢谢

回答

1

你不能这样做,在MongoDB中还没有(注意来自未来的访客:我指的是V3.2)。

你必须迭代文件。

注意:如果您不介意删除old字段,请使用renameold重命名为new

NB2对于某些SQLike-fu操作(不是这个)aggregation framework可能有用。

+0

感谢您回应 – user583576

+0

不客气,NB我添加的信息(以防万一) 。 – Ilya

+0

使用聚合 - 请参阅我的回答 – profesor79

0

你可以尝试这样的事情,可能改变_id当您要更新其他文件:

db.testData.find().forEach(function(elem) { 
    db.testData.update({ 
    "_id": "56e0a3a2d59feaa43fba49d5" 
    }, { 
    $set: { 
     new: elem.old 
    } 
    }); 
}); 
+0

这就是“遍历每个文档”... – Ilya

+0

我不想遍历所有产品。谢谢你的回复,尽管 – user583576

+0

你可以使用'limit(1)'获得一个elem。 – Bun