как остановить преобразование объекта rethinkdb в массив?

Я очень смущен здесь. Я передаю объект с именем ScheduleAdd и использую insertAt для ввода этого объекта в массив с именем «расписания», который существует в каждом документе в таблице «учителя». Переосмысление выдает ошибку «Вставленное значение должно быть ОБЪЕКТОМ (получено МАССИВ)». Он показывает мне массив, состоящий из моего переданного объекта с квадратными скобками вокруг него.

Код:

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}"]',

Любая идея, почему мой объект преобразуется в массив и как я могу предотвратить это? Спасибо!


person BarthesSimpson    schedule 30.08.2014    source источник


Ответы (1)


Из документации обновление 1 ожидает либо объект, либо выражение, возвращающее объект, в вашем случае вы передаете выражение:

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

Из документации также следует, что insertAt «возвращает измененный массив» 2. Это означает, что ваше выражение возвращает новый массив расписаний, а не объект для обновления. В результате обновление заканчивает тем, что пытается вставить массив, когда ожидает объект. Чтобы продемонстрировать это, попробуйте запустить:

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)})

or

r.db('test').table('teachers').update(function(teacher) {return {schedules : teacher('schedules').insertAt(0,scheduleAdd)}})
person jek    schedule 30.08.2014
comment
Спасибо - это идеально. Как насчет того, когда я хочу удалить запись (после ввода нескольких других объектов)? Я знаю, что могу использовать deleteAt, но мне трудно определить порядковый номер элемента, который я хочу удалить в массиве расписаний (который будет разным для каждого учителя). - person BarthesSimpson; 30.08.2014
comment
@user3220303 user3220303 Вы можете использовать deleteAt или difference или любое количество других функций, это действительно зависит от того, какую информацию вы имеете о расписании, которое хотите удалить из массива. Если у вас все еще есть проблемы, я бы порекомендовал открыть новый вопрос с более подробной информацией. - person jek; 30.08.2014
comment
difference все изменил. Спасибо еще раз. - person BarthesSimpson; 30.08.2014