【问题标题】:Restheart Aggregation Framework - Optional Avars?Restheart 聚合框架 - 可选的 Avars?
【发布时间】:2017-04-26 14:48:27
【问题描述】:

我们在 RestHeart 中有一个聚合查询,效果很好。

match 部分,我们允许用户指定特定的文档 ID,以仅返回该文档:

                "_$match" : {
                    "_id" : {
                        "_$var" : "n"
                    },

但是,我们也希望用户能够省略此操作,并获取集合中的所有文档。

有没有办法让avars 成为可选,或者为avar 指定一个通配符?目前,如果用户省略了 avar,他们会得到一个错误。并将 avar 设置为 null 或空字符串与这些值匹配。

我想另一种选择是聚合查询属性中是否可以存在条件逻辑——不确定这是否可能。

谢谢

汤姆

【问题讨论】:

    标签: restheart


    【解决方案1】:

    我找到了一个更简单的解决方案。 _properties 集合中的聚合查询可以保持原样,但可以在 GET 请求中指定通配符。这是一个例子:

    GET https://test.restheartapi.com:4443/DataBase/collection/_aggrs/items?avars={"n":/.*/, "m":/.*/ }
    

    ...因此,尽管在 RestHeart 中无法将 avar 设为可选,但仍可以指定通配符作为值。

    我不确定使用这样的正则表达式是否会降低性能,但这似乎是目前唯一简单的方法。

    【讨论】:

    • 嗨,我无法从 javascript 发送 /.*/。它被 {}(空对象)取代。你能帮忙吗?
    • 回复:从 javascript 发送 /.*/。这可能被 javascript 解释为正则表达式;所以我认为它需要逃脱。您可以尝试引用它,或者在每个特殊字符之前使用反斜杠来转义 - 例如:\/.*\/
    【解决方案2】:

    您可以使用$cond 运算符进行条件聚合

    计算一个布尔表达式以返回两个指定的返回表达式之一。

    $cond 表达式有两种语法之一:

    { $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } }

    或者:

    { $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

    【讨论】:

    • 完美---谢谢!所以在我的用例中,如果用户为“n”avar 提供了一个值,那么我就将它包含在匹配中。如果他们没有给出值(我猜这意味着我需要传递一个空字符串,所以 ReSTHeart 不会给出错误),那么我不想将它包含在匹配字符串中。我想我可能需要使用正则表达式来做到这一点: $match: { _id: { "$cond": { if: { $eq: [ {_$var" : "n"}, "" ] }, then: "/.*/", else: {_$var" : "n"} } } } 这看起来对吗 --- 或者有没有办法在不使用正则表达式的情况下做到这一点?
    • 我对此进行了进一步研究,并且匹配部分似乎不支持 $cond 运算符,因此我认为此解决方案不会起作用。我想出了一个使用正则表达式的替代方法(见下文)
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 2016-01-19
    • 2017-10-23
    • 2014-12-14
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多