Couchbase 4.5返回部分文档

时间:2016-04-01 07:18:26

标签: c# .net couchbase n1ql

我目前正在开发一个项目,我们今天使用的是couchbase 4.1,用于电子商务网站。

我想将我们网站的整个类别结构存储在Couchbase中作为单个文档然后查询特定类别并在某些情况下返回该类别,在其他情况下我想返回该类别及其子类别。

我很确定我必须使用数组索引器才能使这项工作高效,但我对Couchbase来说还是新手,所以我不确定它应该如何构建(或者即使它是可能的)。

我的部分文档看起来像这样(结构中有4个级别,大约8-10个顶级类别):

{
  "Categories": [
    {
      "DisplayName": "Category One",
      "Id": 1,
      "Categories": [
        {
          "DisplayName": "Child category",
          "Id": 10,
          "Categories": [
            {
              "DisplayName": "Child child category",
              "Id": 100,
              "Categories": [
                {
                  "DisplayName": "Child child child category",
                  "Id": 1000
                },
                {
                  "DisplayName": "Sibling child category",
                  "Id": 1001
                }                
              ]
            },
            {
              "DisplayName": "Child",
              "Id": 101,
              "Categories": [
                {
                  "DisplayName": "Another child category",
                  "Id": 2001
                }
              ]
            }            
          ]
        }
      ]
    }
  ]
}

如果我查询Id = 100,我希望我的结果如下:

{
  "DisplayName": "Child child category",
  "Id": 100,
  "Categories": [
    {
      "DisplayName": "Child child child category",
      "Id": 1000
    },
    {
      "DisplayName": "Sibling child category",
      "Id": 1001
    }                
  ]
}

在某些情况下,我并没有为孩子服从。我试图使用数组(N1QL)创建我的查询以选择我的数组,但我不确定它是否有可能具有复杂对象的级别。

可以给我一些关于如何做到这一点的指导(即使它是?)。我们正在使用Couchbase .NET客户端。

最好的问候马丁

2 个答案:

答案 0 :(得分:2)

这很有趣,因为您尝试将所有内容存储在一个文档中,然后查询该文档。这是一种方法。

查询没有子类别的类别ID 100:

SELECT c.Id, c.DisplayName
FROM default
UNNEST ( ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END ) AS c
WHERE c.Id = 100;

使用子类别查询类别ID 100:

SELECT c.Id, c.DisplayName, c.Categories
FROM default
UNNEST ( ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END ) AS c
WHERE c.Id = 100;

仅使用一个级别的子类别查询类别ID 100:

SELECT c.Id, c.DisplayName, sub.Id AS SubId, sub.DisplayName AS SubDisplayName
FROM default
UNNEST ( ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END ) AS c
LEFT OUTER UNNEST c.Categories AS sub
WHERE c.Id = 100;

答案 1 :(得分:0)

我唯一能找到的是subdoc(首先在Couchbase 4.5中可用):http://blog.couchbase.com/2016/february/subdoc-explained