Хм. Я тоже не мог заставить это работать, хотя, похоже, должно.
В качестве обходного пути вы можете выполнить самостоятельное присоединение, а затем выполнить фильтрацию на основе внутреннего идентификатора. Примечание: в моем примере я переименовал свойство id
вашего внутреннего объекта человека в personid
, так как этот запрос приводит к нескольким свойствам верхнего уровня id
в противном случае:
select c.id, i.person.personid
from c
join i in c.body.items
where i.person.personid = 101
Результат:
[
{
"id": "1",
"personid": 101
}
]
Я мог бы избежать коллизии id
верхнего уровня, оставив исходные свойства на месте с псевдонимом:
select c.id, i.person.id as personid
from c
join i in c.body.items
where i.person.id = 101
Вы также можете использовать синтаксис скобок для внутренних свойств , что эквивалентно и дает тот же результат:
select c.id, i.person['personid']
from c
join i in c.body.items
where i.person['personid'] = 101
Вышеупомянутый подход также работает при поиске нескольких идентификаторов людей. В качестве примера представьте себе другую запись (id=2
), где массив содержит идентификаторы человека 102 и 103:
select c.id, i.person.personid
from c
join i in c.body.items
where array_contains([101,103],i.person.personid)
Это возвращает:
[
{
"id": "1",
"personid": 101
},
{
"id": "2",
"personid": 103
}
]
Альтернативный синтаксис:
select c.id, i.person.personid
from c
join i in c.body.items
where i.person.personid in (101,103)