将N1QL与文档密钥一起使用

时间:2015-07-08 16:33:21

标签: couchbase couchbase-view 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个文档。

我所做的工作是通过以下方式获取此文档的ID:

var result = CouchbaseManager.Bucket.Get<dynamic>(couchbaseKey);
mygroup = JsonConvert.DeserializeObject<Group> (result.ToString());

然后我可以循环浏览它的商店列表并以同样的方式获得所有商店,但我不需要团体中的任何其他商品,我想要的只是商店而且会我们希望在一次操作中做到这一点。

有谁知道如何直接对指定的文档值执行N1QL? 类似的东西(这是完全想象的非工作代码我只是想清楚地说明我想要达到的目的):

  

SELECT * FROM mycouchbase WHERE documentkey IN    Group_1.StoreList

由于

更新 所以Nic的解决方案不起作用;

这是我最接近我需要的东西:

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

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

返回我想要的任何给定组(Group_X)的商店的ID列表 - 我还没有找到一种方法来获取完整的商店,而不仅仅是在同一个语句中的ID。

有了,我会发布完整的解决方案以及我在此过程中遇到的所有速度障碍。

4 个答案:

答案 0 :(得分:5)

如果我对你的问题有误解,我道歉,但我会尽我所能。如果我误解了,请告诉我,我们将从那里开始工作。

让我们使用以下场景:

<强> GROUP_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的UNNESTJOIN运算符。

这可能会给你一个类似的查询:

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并将组ID切换为百分比通配符。

如果某些事情没有意义,请告诉我。

最佳,

答案 1 :(得分:0)

尝试此查询:

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

答案 2 :(得分: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);

答案 3 :(得分: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