Использование N1QL с ключами документа
Я довольно новичок в couchbase и пытался найти ответ на конкретный запрос, который я пытаюсь создать, но пока без особого успеха.
Я спорил между использованием представления или N1QL для этого конкретного случая и согласился с N1QL, но не смог заставить его работать, так что, возможно, представление все-таки лучше.
В основном у меня есть ключ документа (Group_1) для следующего документа:
Group_1
{
"cbType": "group",
"ID": 1,
"Name": "Group Atlas 3",
"StoreList": [
2,
4,
6
]
}
У меня также есть "хранилище" документов, их ключи перечислены в списке этого документа. (Store_2, Store_4, Store_6 и они имеют значение storeID, равное 2, 4 и 6). Я в основном хочу получить все 3 перечисленных документа.
Что у меня действительно работает, так это то, что я получаю этот документ с его идентификатором, выполняя:
var result = CouchbaseManager.Bucket.Get<dynamic>(couchbaseKey);
mygroup = JsonConvert.DeserializeObject<Group> (result.ToString());
Затем я могу просмотреть его список магазинов и получить все его магазины таким же образом, но мне больше ничего не нужно от группы, все, что мне нужно, это магазины, и я бы предпочел сделать это за одну операцию.
Кто-нибудь знает, как сделать N1QL непосредственно для указанного значения документа? Что-то вроде (и это полный мнимый нерабочий код, который я просто пытаюсь ясно проиллюстрировать, что я пытаюсь получить):
SELECT * FROM mycouchbase WHERE ключ документа в Group_1.StoreList
Спасибо
ОБНОВЛЕНИЕ: таким образом решение Ника не работает;
Это самое близкое к тому, что мне нужно:
SELECT b from DataBoard c USE KEYS ["Group_X"] UNNEST c.StoreList b;
"results":[{"b":2},{"b":4},{"b":6}]
Который возвращает список идентификаторов хранилищ, которые я хочу для любой данной группы (Group_X) - я не нашел способа получить полные хранилища вместо просто идентификатора в том же заявлении.
Как только я это сделаю, я опубликую полное решение, а также все сообщения об ошибках, с которыми я столкнулся в процессе.
4 ответа
Я прошу прощения, если у меня есть неправильное понимание вашего вопроса, но я собираюсь дать ему мой лучший шанс. Если я неправильно понял, пожалуйста, дайте мне знать, и мы будем работать оттуда.
Давайте использовать следующий сценарий:
группа 1
{
"cbType": "group",
"ID": 1,
"Name": "Group Atlas 3",
"StoreList": [
2,
4,
6
]
}
store_2
{
"cbType": "store",
"ID": 2,
"name": "some store name"
}
store_4
{
"cbType": "store",
"ID": 4,
"name": "another store name"
}
store_6
{
"cbType": "store",
"ID": 6,
"name": "last store name"
}
Теперь допустим, что вы не хотите запрашивать магазины из определенной группы (group_1), но не включаете другую информацию о группе. По сути, вы хотите использовать N1QL UNNEST
а также JOIN
операторы.
Это может оставить вас с таким запросом:
SELECT
stores.name
FROM `bucket-name-here` AS groups
UNNEST groups.StoreList AS groupstore
JOIN `bucket-name-here` AS stores ON KEYS ("store_" || groupstore.ID)
WHERE
META(groups).id = 'group_1';
Несколько предположений сделаны в этом. Оба ваших документа находятся в одной корзине, и вы хотите выбрать только group_1
, Конечно, вы могли бы использовать LIKE
и переключите идентификатор группы на групповой символ процента.
Дайте мне знать, если что-то не имеет смысла.
Лучший,
Попробуйте этот запрос:
select Name
from buketname a join bucketname b ON KEYS a.StoreList
where Name="Group Atlas 3"
У меня есть аналогичное требование, и я получил то, что мне нужно, с помощью запроса:
SELECT store
FROM `bucket-name-here` group
JOIN `bucket-name-here` store ON KEYS group.StoreList
WHERE group.cbType = 'group'
AND group.ID = 1
На основании вашего обновления вы можете сделать следующее:
SELECT b, s
FROM DataBoard c USE KEYS ["Group_X"]
UNNEST c.StoreList b
JOIN store_bucket s ON KEYS "Store_" || TO_STRING(b);