如何使用Couchbase N1QL查询获取所有书籍名称?
解决Couchbase中提取所有书籍name字段的查询问题
文档结构
你的Couchbase文档结构如下:
{ "docId": "1111212", "user": { "id": "5050017", "name": "string", "type": "string" }, "books": { "1": { "id": "1", "name": "Book1", "author":{ "id":"A1", "name":"name" } }, "2": { "id": "2", "name": "Book2", "author":{ "id":"A2", "name":"name" } } } }
问题分析
你之前尝试的两个查询都无法满足需求:
SELECT b.books.*.name FROM bucket_name b where meta().id like '%books_details%' OFFSET 0 LIMIT 10:N1QL不支持*.name这种多层通配的直接引用写法,无法正确提取每个书籍对象的name字段。SELECT OBJECT_NAMES(b.books) FROM bucket_name b where meta().id like '%books_details%' OFFSET 0 LIMIT 10:OBJECT_NAMES()仅返回books对象的键名(如"1"、"2"),而非对应书籍对象中的name属性。
正确查询方法
方法1:拆分每个书籍为单独行返回
使用OBJECT_VALUES()将books对象的所有值转换为数组,再通过UNNEST将数组拆分为单独的行,即可逐个提取书籍name:
SELECT book.name FROM bucket_name b UNNEST OBJECT_VALUES(b.books) AS book WHERE META().id LIKE '%books_details%' OFFSET 0 LIMIT 10;
查询返回结果示例:
[ { "name": "Book1" }, { "name": "Book2" } ]
方法2:将同文档的书籍name整理为数组返回
如果需要把单份文档下的所有书籍name放在一个数组里返回,使用数组推导式:
SELECT ARRAY book.name FOR book IN OBJECT_VALUES(b.books) END AS book_names FROM bucket_name b WHERE META().id LIKE '%books_details%' OFFSET 0 LIMIT 10;
查询返回结果示例:
[ { "book_names": ["Book1", "Book2"] } ]
内容的提问来源于stack exchange,提问作者ULLAS K
相关产品推荐
相关产品推荐

