我有一个
ProductDocument
CosmosDB中的模型,表示产品。在这个模型中有一个子文档
contributors
其中包含谁对产品做出了贡献。每个贡献者都有一个
role
是的。
现在我正在尝试一个查询,它需要:
-
只选择
产品文档
用一个
contributor.roleDescription
属于
作者
-
只选择
产品文档
用一个
division
属于
发布1
-
只包括
贡献者
子文档带有
贡献者角色描述
属于
作者
在结果集中。
现在我在挣扎:
-
以上选择的第3部分。如何完成这一点,因为我的结果集包括
贡献者角色描述
属于
作者
以及
插图画家
宇宙模型示例:
[
{
"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"
}
]
}]
这是我在
数据资源管理器
以下内容:
SELECT VALUE p
FROM Products p
JOIN c IN p.contributors
WHERE c.roleDescription = 'Author'
AND p.division = 'Pub 1'
这是我的服务中的linq查询:
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>());
}
它选择正确的记录,但如何取消选择
插图画家
贡献者的子文档,因为目前我得到了以下信息:
{
"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 Contributor子文档:
{
"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"
}
]
}
编辑:
-
我想过滤一下
Product
如果其中一个子文档
贡献者角色描述
等于作者。因此,如果产品记录中没有作者贡献者,我不希望
-
我想包括每个
contributor
等于的子文档
作者
是的。因此,如果
产品
,我想包括它们,但不包括
插图画家
一个。
-
你可以收集
ProductDocuments
是的。
-
对流畅的linq语法有很大帮助。