如何停止rethinkdb将对象转换为数组?

时间:2014-08-30 02:07:30

标签: javascript arrays rethinkdb

我在这里很困惑。我正在传递一个名为ScheduleAdd的对象,并使用insertAt将该对象输入到名为'schedules'的数组中,该数组存在于表'teachers'中的每个文档中。重新思考抛出错误“插入的值必须是一个OBJECT(得到阵列)”。它向我展示了一个数组,它由我传递的对象组成,并带有方括号。

代码:

var scheduleAdd = {};
    scheduleAdd.schedule = name;
    scheduleAdd.visible = 'yes';
    console.log(scheduleAdd);  
r.db('test').table('teachers').update(function(teacher) {return teacher('schedules').insertAt(0,scheduleAdd)}).run(connection, function(err, result) {
    if (err) throw err;
    ;
    console.log('updated teacher schedules');
    console.log(result);
        });
     });

作为一个例子,我可能会传递对象:

{ schedule: 'weekend', visible: 'yes' }

console.log确认对象格式正确。但是Rethink会抛出错误:

'Inserted value must be an OBJECT (got ARRAY):\n["{\\n  \\"schedule\\": \\"weekend\\",\\n      \\"visible\\": \\"yes\\"\\n}"]',

知道为什么我的对象被转换成数组,以及如何阻止它发生?谢谢!

1 个答案:

答案 0 :(得分:4)

从文档中,更新1要求对象或表达式返回一个对象,在您传递表达式的情况下:

function(teacher) {return teacher('schedules').insertAt(0,scheduleAdd)}

从文档中,insertAt“返回修改后的数组”2。这意味着您的表达式将返回新的计划数组,而不是更新的对象。因此,更新最终会在需要Object时尝​​试插入Array。要证明这一点,请尝试运行:

r.db('test').table('teachers').insert({schedules:[{name:"first"}]});
r.db('test').table('teachers').update(function(teacher) {return teacher('schedules').insertAt(0,{name:"second"})})

您将收到错误:

Inserted value must be an OBJECT (got ARRAY):
[{
        "name": "second"
    }, {
        "name": "first"
    }]

带有{"name":"second"}的已修改数组正确地预先添加到该行的现有调度数组中,并且insertAt返回新数组。但是,更新无法插入数组,因此会引发错误。

要解决此问题,您可以使用:

r.db('test').table('teachers').update({schedules : r.row('schedules').insertAt(0,scheduleAdd)})

r.db('test').table('teachers').update(function(teacher) {return {schedules : teacher('schedules').insertAt(0,scheduleAdd)}})