首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CosmosDB - SubDocument删除- LINQ查询

CosmosDB - SubDocument删除- LINQ查询
EN

Stack Overflow用户
提问于 2018-06-26 12:09:51
回答 2查看 803关注 0票数 0

我在CosmosDB中有一个CosmosDB模型,它表示一个产品。在该模型中,有一个子文档contributors,它保存了对产品做出贡献的人。每个贡献者都有一个role

现在,我已经尝试了一个查询,它需要:

  1. 只选择ProductDocumentcontributor.roleDescription of Author
  2. 只选择ProductDocumentdivision of Pub 1
  3. 结果集中只包含带有contributor.roleDescription of Author子文档。

现在我在努力:

  1. 以上选择的第三部分。如何完成这一步,因为我的结果集包括contributor.roleDescription of 作者和Illustrator

示例宇宙模型:

代码语言:javascript
复制
[

    {
        "id": "1",
        "coverTitle": "A Title",
        "pubPrice": 2.99,
        "division" :"Pub 1",
        "Availability": {
            "code": "20",
            "description": "Digital No Stock"
        },
        "contributors": [
            {
                "id": 1,
                "firstName": "Brad",
                "lastName": "Smith",
                "roleDescription": "Author",
                "roleCode": "A01"
            },
            {
                "id": 2,
                "firstName": "Steve",
                "lastName": "Bradley",
                "roleDescription": "Illustrator",
                "roleCode": "A12"
            }
        ]

    },
    {
        "id": "2",
        "coverTitle": "Another Title",
        "division" :"Pub 2",
        "pubPrice": 2.99,
        "Availability": {
            "code": "50",
            "description": "In Stock"
        },
        "contributors": [
            {
                "id": 1,
                "firstName": "Gareth Bradley",
                "lastName": "Smith",
                "roleDescription": "Author",
                "roleCode": "A01"
            }
        ]

    }]

下面是我在中一直在使用的SQL

代码语言:javascript
复制
SELECT VALUE p
FROM Products p
JOIN c IN p.contributors
WHERE c.roleDescription = 'Author'
AND p.division = 'Pub 1'

以下是我服务中的LINQ查询:

代码语言:javascript
复制
        var query = client.CreateDocumentQuery<ProductDocument>(
            UriFactory.CreateDocumentCollectionUri("BiblioAPI", "Products"),
            new FeedOptions
            {
                MaxItemCount = -1,
                EnableCrossPartitionQuery = true
            }
            ) 
            .SelectMany(product  => product.Contributors
                .Where(contributor => contributor.RoleDescription == "Author")
                .Select(c => product)
                .Where(p => product.Division == "Pub 1"))
            .AsDocumentQuery();

        List<ProductDocument> results = new List<ProductDocument>();
        while (query.HasMoreResults)
        {
            results.AddRange(await query.ExecuteNextAsync<ProductDocument>());
        }

它选择正确的记录,但是如何取消选择贡献者的Illustrator子文档,因为目前我得到了以下内容:

代码语言:javascript
复制
   {
        "id": "1",
        "coverTitle": "A Title",
        "pubPrice": 2.99,
        "division" :"Pub 1",
        "Availability": {
            "code": "20",
            "description": "Digital No Stock"
        },
        "contributors": [
            {
                "id": 1,
                "firstName": "Brad",
                "lastName": "Smith",
                "roleDescription": "Author",
                "roleCode": "A01"
            },
            {
                "id": 2,
                "firstName": "Steve",
                "lastName": "Bradley",
                "roleDescription": "Illustrator",
                "roleCode": "A12"
            }
        ]

    }

但是,下面的输出是我想要的,不包括Illustrator贡献者子文档:

代码语言:javascript
复制
 {
        "id": "1",
        "coverTitle": "A Title",
        "pubPrice": 2.99,
        "division" :"Pub 1",
        "Availability": {
            "code": "20",
            "description": "Digital No Stock"
        },
        "contributors": [
            {
                "id": 1,
                "firstName": "Brad",
                "lastName": "Smith",
                "roleDescription": "Author",
                "roleCode": "A01"
            }

        ]

    }

编辑:

  1. 如果其中一个子文档Product等于Author,我想在contributor.roleDescription上进行筛选。因此,如果Product不包括作者贡献者,我不想要它
  2. 我想包括每个等于contributor作者子文档。因此,如果一个Product有多个作者贡献者子文档,我希望包含它们,但不包括Illustrator文档。
  3. 您可以拥有一组ProductDocuments
  4. 关于流利LINQ语法的帮助将非常有帮助。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-01 07:27:15

Azure CosmosDB现在支持子查询。使用子查询,您可以通过两种方式完成这一任务,但差别很小:

  1. 您可以在投影中使用带有子查询的数组表达式,过滤出不需要的贡献者,并投影出所有其他属性。此查询假定您需要一个除数组之外的项目属性的选择列表。 选择c.id、c.coverTitle、c.division、ARRAY(在c.contributors中从贡献者中选择值贡献者contributor.roleDescription = "Author")从c中选择c.division="Pub 1“

这假设您需要对除法"Pub 1“进行筛选,然后是带有数组表达式的子查询。

  1. 或者,如果您希望整个文档与筛选的贡献者一起使用,您可以这样做: 选择c,数组(在c.contributors中从贡献者中选择值贡献者,其中contributor.roleDescription = "Author")从c中选择c.division="Pub 1“

这将在标记为"c“的属性中使用"Pub 1”除法来投影原始文档,并在标记为“贡献者”的属性中分别使用筛选的贡献者数组。可以为筛选的贡献者引用此贡献者数组,而忽略文档中的贡献者数组。

票数 4
EN

Stack Overflow用户

发布于 2018-06-26 21:47:50

这可以做你想做的事,但是很明显,如果你有多个贡献者,你想要证明它可能做不到你想做的事情--很难用你的问题来判断这是否是你想要的。

代码语言:javascript
复制
SELECT p.id, p.coverTitle, p.pubPrice, p.division, p.Availability, c as contributors
FROM Products p
JOIN c IN p.contributors
WHERE c.roleDescription = 'Author'
AND p.division = 'Pub 1'

产出如下:

代码语言:javascript
复制
[
    {
        "id": "1",
        "coverTitle": "A Title",
        "pubPrice": 2.99,
        "division": "Pub 1",
        "Availability": {
            "code": "20",
            "description": "Digital No Stock"
        },
        "contributors": {
            "id": 1,
            "firstName": "Brad",
            "lastName": "Smith",
            "roleDescription": "Author",
            "roleCode": "A01"
        }
    }
]

注意,贡献者不是一个列表,它是一个值,所以如果多个贡献者匹配过滤器,那么您将得到相同的产品多次返回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51042600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档