C# Couchbase 4.5文件的返回部分

C# Couchbase 4.5文件的返回部分,c#,.net,couchbase,n1ql,C#,.net,Couchbase,N1ql,我目前正在从事一个项目,从今天起,我们将couchbase 4.1用于一个电子商务网站 我想在Couchbase中将我们网站的整个类别结构存储为单个文档,然后查询特定类别并返回该类别。在某些情况下,我想返回该类别及其子类别 我非常确定我必须使用数组索引器来提高工作效率,但我对Couchbase还很陌生,所以我不确定它应该如何构造(或者即使可能) 我的部分文档如下所示(结构中有4个级别,大约有8-10个顶级类别): 如果我查询Id=100,我希望我的结果如下所示: { "DisplayName

我目前正在从事一个项目,从今天起,我们将couchbase 4.1用于一个电子商务网站

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

我非常确定我必须使用数组索引器来提高工作效率,但我对Couchbase还很陌生,所以我不确定它应该如何构造(或者即使可能)

我的部分文档如下所示(结构中有4个级别,大约有8-10个顶级类别):

如果我查询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客户端


向Martin致意

我唯一能找到的是subdoc(首次在Couchbase 4.5中提供):

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

要查询没有子类别的类别Id 100,请执行以下操作:

{
  "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
                }
              ]
            }            
          ]
        }
      ]
    }
  ]
}
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;
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;
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;
要使用子类别查询类别Id 100,请执行以下操作:

{
  "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
                }
              ]
            }            
          ]
        }
      ]
    }
  ]
}
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;
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;
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;
要查询仅包含一级子类别的类别Id 100,请执行以下操作:

{
  "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
                }
              ]
            }            
          ]
        }
      ]
    }
  ]
}
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;
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;
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;

subdoc可能非常适合,但它不是用于查询目的:您必须知道要检索的路径。但是,如果可以更改文档结构,使根对象是一个字典,每个类别有一个条目,属性名是类别ID,那么这就可以工作了。看起来真的很好!我周一早上第一件事就是试试!有没有可能创建一个索引来加快搜索速度?在文档中找不到任何内容,搜索也没有给出任何真正的答案。我尝试为此创建索引,但在4.5中不可能。问题是您的所有数据都在一个文档中。通常,索引从值映射到文档,因此您可以快速访问正确的文档。在您的情况下,您需要一个索引来访问文档的一部分,并帮助您避免处理整个文档。在4.5中不太可能。另一个选项是使用map reduce视图。map reduce视图将发出并存储(Id、DisplayName、Categories)的每个组合,您可以直接查询视图中给定的Id。您可以在map reduce视图上查看Couchbase文档并编写emit()函数。在使用查询时,是否可以将查询限制为仅获取第一级类别或向下获取第二级类别?它现在工作得很好,但更多的是减少一点结果大小:)添加到答案中。