MongoDB更新:根据现有字段生成新字段,或者就地更新

时间:2014-02-17 22:03:57

标签: mongodb

我一直在讨论这个问题已经有一段时间没找到关于如何完成这项任务的例子和解释。

我有一个文档集合,每个文档都有一个日期/时间字段。理想情况下,我需要为每个文档生成一个新字段,其中值基于添加常量因子的日期/时间字段的时间。

或者,只需更新适当的值即可。

我无法弄清楚如何在mongo shell更新语句中引用当前文档。

这是愚蠢的吗?我应该放弃并编写应用程序来完成这个看似简单的操作吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

有时简单地写出问题会带给你一个解决方案。有点hacky,绝对奇怪,但似乎工作:

db.actuals.find().forEach(
    function(d) { 
        var dt = d.date; 
        var ndt = new Date(d.date).setHours(dt.getHours() - 8); 
        db.actuals.update( {_id: d._id}, { $set: { local: new Date(ndt) } } );
    }
)

答案 1 :(得分:0)

对于那些完成任何SQL编程的人来说,它并不是愚蠢的,而是你所假设的那些事情之一就在那里,你会惊讶地发现事实并非如此。我也曾经一度寻找这个,然后空了。你可以在shell中做的是手动编写转换脚本。使用db.collection.find()来获取候选者并获取他们的方式。这是我们在进行大型迁移之前备份集合的方式

db.config.find().forEach( function( x ) { db.config_20131119_bak.insert( x ) } );

你在这个功能中所做的可能会有所不同,但它对我来说效果很好。