gpt4 book ai didi

azure - 在子对象的查询中返回重复项

转载 作者:行者123 更新时间:2023-12-03 03:15:13 27 4
gpt4 key购买 nike

我的文档中有一个像这样的数据结构(请注意,为了简洁起见,这是简化的):

{
"id": "c1c1c1c1-c1c1-c1c1-c1c1-c1c1c1c1c1c1",
"name": "Bruce Banner",
"accountId": "a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1",
"contributors": [{
"accountId": "a2a2a2a2-a2a2-a2a2-a2a2-a2a2a2a2a2a2",
"type": "Foo"
},{
"accountId": "a3a3a3a3-a3a3-a3a3-a3a3-a3a3a3a3a3a3",
"type": "Bar"
}]
},
{
"id": "c2c2c2c2-c2c2-c2c2-c2c2-c2c2c2c2c2c2",
"name": "Tony Stark",
"accountId": "a2a2a2a2-a2a2-a2a2-a2a2-a2a2a2a2a2a2",
"contributors": [{
"accountId": "a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1",
"type": "Fizz"
}]
},

我正在尝试编写一个查询来检索所提供的 accountId 位于父记录上或 contributors 数组中的文档:

SELECT e.id, e.accountId, e.name
FROM Entitity e
JOIN co IN e.contributors
WHERE e.accountId = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'
OR co.accountId = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'

结果:

[{
"id": "c1c1c1c1-c1c1-c1c1-c1c1-c1c1c1c1c1c1",
"accountId": "a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1",
"name": "Bruce Banner"
},{
"id": "c1c1c1c1-c1c1-c1c1-c1c1-c1c1c1c1c1c1",
"accountId": "a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1",
"name": "Bruce Banner"
},{
"id": "c2c2c2c2-c2c2-c2c2-c2c2-c2c2c2c2c2c2",
"accountId": "a2a2a2a2-a2a2-a2a2-a2a2-a2a2a2a2a2a2",
"name": "Tony Stark"
}]

如您所见,第一个实体 (Bruce Banner) 是重复的。如果我删除 JOIN 子句,它就会正常工作。谁能告诉我这是为什么,以及如何避免重复?

编辑 - 为了清楚起见,这是我的预期回复:

[{
"id": "c1c1c1c1-c1c1-c1c1-c1c1-c1c1c1c1c1c1",
"accountId": "a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1",
"name": "Bruce Banner"
},{
"id": "c2c2c2c2-c2c2-c2c2-c2c2-c2c2c2c2c2c2",
"accountId": "a2a2a2a2-a2a2-a2a2-a2a2-a2a2a2a2a2a2",
"name": "Tony Stark"
}]

最佳答案

我发现您正在尝试查询 accountId贡献者accountId 是否等于某个值。

今天 - 您需要使用 JOIN 运算符执行叉积,以便查询 JSON 数组中的所有元素(注意:您不需要 JOIN code> 查询特定数组索引,例如 WHERE e.contributors[0].accountId = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1')。

在您的示例 abpve 中,您将从查询中获得重复项,这是不可避免的。您将需要实现一些应用程序逻辑来过滤查询结果中的重复项。

为了更好地了解 JOIN 的行为(考虑简单的叉积),请尝试从您正在生成叉积的数组中添加一个字段(例如 co.type ):

SELECT e.id, e.accountId, e.name, co.type
FROM Entitity e
JOIN co IN e.contributors
WHERE e.accountId = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'
OR co.accountId = 'a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1'

结果是:

[{
id: c1c1c1c1 - c1c1 - c1c1 - c1c1 - c1c1c1c1c1c1,
accountId: a1a1a1a1 - a1a1 - a1a1 - a1a1 - a1a1a1a1a1a1,
name: Bruce Banner,
type: Foo
}, {
id: c1c1c1c1 - c1c1 - c1c1 - c1c1 - c1c1c1c1c1c1,
accountId: a1a1a1a1 - a1a1 - a1a1 - a1a1 - a1a1a1a1a1a1,
name: Bruce Banner,
type: Bar
}, {
id: c2c2c2c2 - c2c2 - c2c2 - c2c2 - c2c2c2c2c2c2,
accountId: a2a2a2a2 - a2a2 - a2a2 - a2a2 - a2a2a2a2a2a2,
name: Tony Stark,
type: Fizz
}]

正如您从结果中看到的 - 为每个子项返回一条记录:FooBarFizz。这是因为每个数组元素都与指定的查询匹配。

关于azure - 在子对象的查询中返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com