Использование 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);
Другие вопросы по тегам