1

我对 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 的解决方案不起作用;

这是我最接近我需要的atm:

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

4 回答 4

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) 中的商店,但不包含有关该组的其他信息。您本质上想使用 N1QLUNNESTJOIN运算符。

这可能会给您留下如下查询:

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。当然,您可以使用 aLIKE并将组 ID 切换为百分比通配符。

如果有什么不明白的,请告诉我。

最好的,

于 2015-07-08T17:33:13.957 回答
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);
于 2015-08-09T15:27:33.187 回答
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
于 2016-03-14T20:39:13.680 回答
0

试试这个查询:

select Name 
from buketname a join bucketname b ON KEYS a.StoreList 
where Name="Group Atlas 3"
于 2015-08-09T07:29:04.020 回答