我在CosmosDB中有一个CosmosDB模型,它表示一个产品。在该模型中,有一个子文档contributors,它保存了对产品做出贡献的人。每个贡献者都有一个role。
现在,我已经尝试了一个查询,它需要:
ProductDocument和contributor.roleDescription of AuthorProductDocument和division of Pub 1contributor.roleDescription of Author的子文档。现在我在努力:
contributor.roleDescription of 作者和Illustrator示例宇宙模型:
[
{
"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
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>());
}它选择正确的记录,但是如何取消选择贡献者的Illustrator子文档,因为目前我得到了以下内容:
{
"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贡献者子文档:
{
"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等于Author,我想在contributor.roleDescription上进行筛选。因此,如果Product不包括作者贡献者,我不想要它contributor作者的子文档。因此,如果一个Product有多个作者贡献者子文档,我希望包含它们,但不包括Illustrator文档。ProductDocuments。发布于 2018-07-01 07:27:15
Azure CosmosDB现在支持子查询。使用子查询,您可以通过两种方式完成这一任务,但差别很小:
这假设您需要对除法"Pub 1“进行筛选,然后是带有数组表达式的子查询。
这将在标记为"c“的属性中使用"Pub 1”除法来投影原始文档,并在标记为“贡献者”的属性中分别使用筛选的贡献者数组。可以为筛选的贡献者引用此贡献者数组,而忽略文档中的贡献者数组。
发布于 2018-06-26 21:47:50
这可以做你想做的事,但是很明显,如果你有多个贡献者,你想要证明它可能做不到你想做的事情--很难用你的问题来判断这是否是你想要的。
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'产出如下:
[
{
"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"
}
}
]注意,贡献者不是一个列表,它是一个值,所以如果多个贡献者匹配过滤器,那么您将得到相同的产品多次返回。
https://stackoverflow.com/questions/51042600
复制相似问题