2015-07-08 5 views
1

Я довольно новичок в couchbase и попытался найти ответ на конкретный запрос, который я пытаюсь создать с небольшим успехом.Использование N1QL с ключами документа

Я обсуждал между использованием представления или N1QL для этого конкретного случая и был установлен с N1QL, но не смог заставить его работать, поэтому, возможно, в конце концов лучше.

В принципе у меня есть ключ документа() для 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 documentkey В Group_1.StoreList

Благодаря

UPDATE: Так решение Nic не работает;

Это ближайший я получаю то, что мне нужно атм:

SELECT b from DataBoard c USE KEYS ["Group_X"] UNNEST c.StoreList b; 

"results":[{"b":2},{"b":4},{"b":6}] 

который возвращает список идентификаторов магазинов, которые я хочу для любой группы (Group_X) - я не нашел способ получить полные магазины, а не только идентификатор в том же заявлении.

Как только у меня есть, я опубликую полное решение, а также все удары по скорости, с которыми я столкнулся в процессе.

+0

поэтому после возникновения проблем с log4net. Я только что удалил его полностью, чтобы продолжить тестирование, и, несмотря на то, что ответ @Nic Raboy выглядит точно так же, как я пытаюсь сделать, он возвращает пустой (нулевой) объект – Spacemonkey

ответ

5

Извиняюсь, если у меня возникло непонимание вашего вопроса, но я собираюсь дать ему лучший снимок. Если я не понял, пожалуйста, дайте мне знать, и мы будем работать оттуда.

Давайте будем использовать следующий сценарий:

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

Теперь предположим, вы wan't запросить магазины от определенной группы (в 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 и переключить идентификатор группы на групповой символ процента.

Сообщите мне, если что-то не имеет смысла.

Бест,

+0

Это действительно очень похоже на то, что я пытаюсь делать. Я не знал о ключевых словах «ON KEYS» или META. Сейчас я пытаюсь это сделать. – Spacemonkey

+0

. Дайте мне знать, как это происходит :-) –

+0

Будет, у меня просто возникают проблемы с конфликтующими json-dll в данный момент но как только это выяснится, я обязательно позабочусь о том, работает ли это или что делает. – Spacemonkey

0

Попробуйте этот запрос:

select Name 
from buketname a join bucketname b ON KEYS a.StoreList 
where Name="Group Atlas 3" 
0

На основе вашего обновления, вы можете сделать следующее:

SELECT b, s 
FROM DataBoard c USE KEYS ["Group_X"] 
UNNEST c.StoreList b 
JOIN store_bucket s ON KEYS "Store_" || TO_STRING(b); 
0

У меня есть подобное требование, и я получил то, что мне было нужно с таким запросом:

SELECT store 
FROM `bucket-name-here` group 
JOIN `bucket-name-here` store ON KEYS group.StoreList 
WHERE group.cbType = 'group' 
AND group.ID = 1