首页 文章

将N1QL与文档密钥一起使用

提问于
浏览
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

谢谢

UPDATE: 所以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

    如果我对你的问题有误解,我会道歉,但我会尽我最大的努力 . 如果我误解了,请告诉我,我们将从那里开始工作 .

    我们使用以下场景:

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

    现在让我们说你想要't to query the stores from a particular group (group_1), but include no other information about the group. You essentially want to use N1QL' s 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切换为百分比通配符 .

    如果事情没有意义,请告诉我 .

    最好,

  • 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);
    
  • 5

    我有类似的要求,我得到了我需要的查询,如下所示:

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

相关问题