【问题标题】:Getting only the subdocuments using couchbase N1QL使用 couchbase N1QL 仅获取子文档
【发布时间】:2017-09-04 07:22:04
【问题描述】:

在我们的 couchbase 数据库中,我们有一个包含相对较大对象的存储桶。这些对象内部还有其他对象,比如说人。这应该是一个数组,但是由于某些原因,我们不得不将它创建为对象的对象,这就是它的样子:

{
    "companyName": "company name",
    "companyid": "11111-GUID-11111",
    "people": {
        "22222-GUID-22222": {
            "peopleid": "22222-GUID-22222",
            "name": "name1"
        },
        "33333-GUID-33333": {
            "peopleid": "33333-GUID-33333",
            "name": "name2"
        },
        "44444-GUID-44444": {
            "peopleid": "44444-GUID-44444",
            "name": "name3"
        }
    }
}

使用这种结构,我可以创建一个查询来获取“人”对象,使用如下查询:

SELECT c.*
FROM companies c
WHERE ANY v IN OBJECT_VALUES(c.people) SATISFIES v.peopleid = "22222-GUID-22222" END;

这种结构的问题是数据库响应的是整个公司对象,但是我只需要满足条件的“人”对象,不需要ID不是"22222-GUID-22222"的人。

有什么方法可以使用 couchbase 实现这一点吗?

【问题讨论】:

    标签: sql database couchbase n1ql nosql


    【解决方案1】:
    SELECT FIRST v FOR v IN OBJECT_VALUES(c.people) WHEN v.peopleid = "22222-GUID-22222" END AS people
    FROM companies c
    WHERE ANY v IN OBJECT_VALUES(c.people) SATISFIES v.peopleid = "22222-GUID-22222" END;
    

    【讨论】:

    • 虽然答案总是很受欢迎,但提供一些有关如何您的代码解决手头问题的附加信息确实很有帮助。这样做有助于那些有类似(但不相同)问题的人。不是每个人都熟悉您的确切编码逻辑,但可能了解您的一般方法概念。为了帮助改进您的答案,请提供一些context surrounding it,并查看writing great answers 上的帮助文章以获取有关如何使您的答案重要的一些提示:)
    • vsr,谢谢你的帮助!它几乎解决了我的问题。现在唯一的问题是我必须进行查询,比如说:我必须查询每个年龄超过 50 岁的人。使用您的查询,我只能获得每个文档的第一个匹配项。如果您也可以对此做出回应,那么答案将是完整的,我可以投票并接受您的答案。再次感谢。
    • 我找到了解决方案。我不得不使用 ARRAY 语句而不是 FIRST 。我在沙发上比较新,所以我花了一些时间。所以我会接受这个答案。还有一个问题,有没有办法只使用一个条件来实现这一点?我必须动态构建这些查询。如果这会降低性能,那么我可以接受这个解决方案。
    • SELECT people FROM Companies c LET people = ARRAY v FOR v IN OBJECT_VALUES(c.people) WHEN v.peopleid = "22222-GUID-22222" END WHERE ARRAY_LENGTH(people) > 0;跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多