我在这里很困惑。我正在传递一个名为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}"]',
知道为什么我的对象被转换成数组,以及如何阻止它发生?谢谢!
答案 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)}})