【问题标题】:Couchbase N1QL query to find document that has a field value containing the ID of another document that existsCouchbase N1QL 查询以查找具有包含另一个存在的文档的 ID 的字段值的文档
【发布时间】:2021-06-24 11:40:22
【问题描述】:

我有一个 Couchbase 存储桶“企业”文档,例如:企业列表,如 Listing_HomeDepot、listing_Lowes、listing_DansHardware。

每个 Listing_* 文档都有一个字段 businessInfo,其中包含同一存储桶中另一个文档的部分键。例如,listing_DansHardware 有 "businessInfo": "3a4tg",应该有一个文档的 key info_3a4tg。文档 info_3a4tg 有一个“id”字段,其中包含“3a4tg”。

假设 Dans Hardware 关闭并且 info_3a4tg 文档被删除。我想选择存储桶中的所有企业,但过滤掉所有具有孤立企业信息引用的企业。

我试过了: select * from business b1 where b1.category='hardware' and exists (select * from business b2 use keys 'info_'||b1.businessInfo)

但这没有用。我收到一些“文档键必须是字符串”错误。有什么建议吗?

【问题讨论】:

  • 这些答案有帮助!所以奇怪的是,即使 N1QL 结果的 allRows 包含我想要的所有文档,警告/错误包含很多相同的“文档键必须是字符串:”警告/错误。我在调试 N1QL 结果时看到了这一点。因此,即使我得到了我需要的文档,我也担心在后台会发生很多低效的事情。我将在下一条评论中分享调试输出。其中有 5679 个,但为简洁起见,我在评论中截断了它们。
  • N1qlQueryResult{ status='success', finalSuccess=true, parseSuccess=true, allRows=[ { .... }, .., , .., { .. .. } ],签名={“”:“”},info=N1qlMetrics{ resultCount=100,errorCount=0,warningCount=5679,...},profileInfo={},errors=[{“msg ": "文档键必须是字符串:", "code": 0 }, ..., { "msg": "文档键必须是字符串: ", "code": 0 } ], ... }

标签: nosql couchbase n1ql


【解决方案1】:

||只能对字符串进行操作。检查您的 businessInfo 是否在所有文档上都有字符串。或使用 IS_STR(b1.businessInfo) 谓词

SELECT b1.*
FROM businesses AS b1
WHERE b1.category = 'hardware'
      AND IS_STR(b1.businessInfo)
      AND EXISTS (SELECT RAW 1 
                  FROM businesses b2 USE KEYS "info_" || b1.businessInfo);

SELECT b1.*
FROM businesses AS b1
JOIN businesses AS b2 ON KEYS "info_" || b1.businessInfo
WHERE b1.category = 'hardware';

【讨论】:

  • 如果 businessInfo 不存在,也会导致此错误。另一个可能有帮助的谓词是 `businessInfo IS NOT MISSING'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多