查询子对象时返回重复项
Duplicates returned in query on child object
我的文档中有一个这样的数据结构(请注意,为简洁起见已简化):
{
"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
或 contributors
的 accountId
是否等于某个值。
今天 - 您需要使用 JOIN
运算符来执行 cross-product 以便查询 JSON 数组中的所有元素(注意:您不需要 JOIN
查询特定的数组索引,例如 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
}]
正如您从结果中看到的那样 - children 中的每一个都返回了一条记录:Foo
、Bar
和 Fizz
。那是因为每个数组元素都匹配指定的查询。
我的文档中有一个这样的数据结构(请注意,为简洁起见已简化):
{
"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
或 contributors
的 accountId
是否等于某个值。
今天 - 您需要使用 JOIN
运算符来执行 cross-product 以便查询 JSON 数组中的所有元素(注意:您不需要 JOIN
查询特定的数组索引,例如 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
}]
正如您从结果中看到的那样 - children 中的每一个都返回了一条记录:Foo
、Bar
和 Fizz
。那是因为每个数组元素都匹配指定的查询。