2015-10-27 3 views
0

Это пример строки в моей таблице RethinkDB.Ошибка при доступе к вложенному объекту JSON

{ 
    "a1": "val1" , 
    "a2": "val2" , 
    "a3": "val3" , 
    "a4": "val4" , 
    "part": [ 
    { 
    "id": "reql" , 
    "position": "student" 
    } , 
{ 
"id": "sdsadda" , 
"position": "officer" 
} 
] , 
"a5": "val5" 

} 

Я хочу получить доступ к вложенный объект JSON, но я получаю е об ошибке: Не удается выполнить кронштейн на не-объект не-последовательности "string" мне нужно всю строку в выходной строки, соответствующие идентификатор «reql " Это мой запрос

r.db('dbname').table('tablename').filter(r.row('part').contains(function(product) { return product('id').eq("reql"); }))

Этот запрос работал раньше .Это не прямо сейчас.

ответ

1

Вы получили бы эту ошибку, если бы у вас каким-то образом оказался элемент в вашем массиве part, который представляет собой строку вместо объекта. Попробуйте запустить .filter(r.row('part').contains(function(product) { return product.typeOf().ne('OBJECT'); }), который должен вернуть все строки, у которых есть строка в массиве part.

+0

Можно ли написать запрос, который дает результаты, несмотря на то, что id является строкой в ​​некоторой строке и объекте во всех остальных? – Puja

+0

Вы можете заменить тело вашего 'contains' чем-то вроде' product.typeOf(). Eq ('OBJECT'). И (product ('id'). Eq ('reql')) '. – mlucy

0

Что касается вашего комментария @Puja, я думаю, что это должен сделать это для вас:

r.db('dbname').table('tablename').filter(function(d){ 
    d("part").typeOf().eq("ARRAY"); 
}).filter(r.row('part').contains(function(d) { 
    return d('id').eq("reql"); 
})) 

Хотя это менее эффективно, чем @ mlucy отвечают, и вы обязательно должны просто сделать один проход над вашим набором данных для очистите его, установив все документы, где part: STRING.

Смежные вопросы