获取RethinkDB中replace(function(){})中的实际字段值



我试图更新到我保存在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));
        });
};

最新更新