我试图更新到我保存在RethinkDB表中的所有条目。基本上,我正在尝试遍历所有条目,读取属性并将处理结果保存回与新属性相同的文档。
我使用replace(function(entry) { return <object>})
作为关键转换块。
在replace函数中,entry.getField('fieldname')
返回一个函数,而不是我存储的值,这就是一切都出错的地方。
从文档中获取实际值的合适方法是什么?
这些行从函数传递到replace
是出错的地方
var ts = entry.getField('timestamp'); // Debugger says 'ts' is a Function!
var date = new Date(ts); // Fails because Date expects a string
完整代码
/* Steps
* 1 - Select all entries in DB.
* 2 - For each entry
* 2.1 - Read existing property 'timestamp' (format: '2015-05-06 15:04:48')
* 2.2 - Convert to rethinkDB format and assign to new property 'timestampraw'
* 2.3 - Replace entry
*/
var migrateDb = function migrateDb(r, conn, dbName, tableName) {
r.db(dbName).table(tableName).limit(2)
.replace(function (entry) {
var ts = entry.getField('timestamp'); // 'ts' is a Function!?
var date = new Date(ts); // This fails, because we are not passing in the actual property value
entry.timestampraw = r.ISO8601(date, {defaultTimezone: '+02'});
entry.converted = true;
return entry;
})
.run(conn, {useOutdated: true, arrayLimit: 1000000}, function (err, res) {
if (err) throw err;
log(util.inspect(res));
});
};
var r = require('rethinkdb');
r.connect(conf).then(function (conn) {
migrateDb(r, conn, conf.db, conf.tableName);
});
数据库中的示例数据
[{ id: '000264a9-63a3-4e8e-90b7-b1c256d79be3',
name: 'waterLevel',
timestamp: '2015-04-30 10:47:44',
unit: 'cm',
value: '14.1'
},
{ id: '0000b44f-5754-498b-ba65-c79660f34618',
name: 'pumpCurrent',
raw: '-224',
timestamp: '2015-05-06 15:04:48',
unit: 'mA',
value: 0
}]
我在表中有近500000个值,所以这就是为什么您在代码示例中看到limit()子句。只是想尝试使用一个小子集。
我使用RethinkDB v2.0.1从Node.js.
我不知道为什么你得到的值是一个函数,但我不认为你可以只是在函数内运行JavaScript。请记住,在entry
内部的replace
函数不是一个JS对象。它是一个ReQL对象。
试试下面的方法:
var migrateDb = function migrateDb(r, conn, dbName, tableName) {
r.db(dbName).table(tableName).limit(2)
.replace(function (entry) {
return entry.merge({
// This is a way to get around ISO8601 date parsing
// We're basically replacing a ' ' with 'T'
'timestampraw' : r.ISO8601(
entry('timestamp').split()(0).add('T').add(entry('timestamp').split()(1)),
{defaultTimezone: '+2'
}),
'converted': true
});
})
.run(conn, {useOutdated: true, arrayLimit: 1000000}, function (err, res) {
if (err) throw err;
log(util.inspect(res));
});
};