5

コレクション「Notifier」があります。このコレクションの次のサンプル ドキュメントがあるとします。

{
  "timestamp": 1413543986,
  "message": "message",
  "readed": {
    "user_8": 0,
    "user_9": 0,
    "user_22": 0
  },
  "type": "1014574149174"
}

次の AQL でこのドキュメントを見つけようとしました。

FOR n IN Notifier
LET usersFound = TO_BOOL(
        FOR user IN n.readed
        FILTER user == 'user_8'
        LIMIT 1
        RETURN user
    )
FILTER usersFound==true
RETURN n

次のエラーが表示されます。

[1501] 構文エラー、予期しない FOR 宣言、3:10 の位置の 'OR user IN n.readed FILT...' の近くに ) が必要です

LET を使用してこの AQL を正しく記述するにはどうすればよいですか?

4

2 に答える 2

5

クエリはほぼ正しいですが、2 つの小さな問題があります。

1) TO_BOOL() は、対応する関数をトリガーする文字です。追加の () で AQL ステートメントをラップすることによってトリガーされるサブクエリを挿入する必要があります。したがって、TO_BOOL(AQL) の代わりに、次を使用する必要があります。 TO_BOOL((AQL));

2) n.readed は JSON オブジェクトで、FOR x IN はリストを期待します。n.readed の属性を反復処理しているため、ここで ATTRIBUTES(n.readed) を使用できます。

あなたの例の正しい解決策は次のとおりです。

FOR n IN Notifier
LET usersFound = TO_BOOL(
        (FOR user IN ATTRIBUTES(n.readed)
        FILTER user == 'user_8'
        LIMIT 1
        RETURN user)
    )
FILTER usersFound==true
RETURN n

PS: 属性の存在のみを探していて、それ以上のフィルタリングを行いたくない場合は、HAS を使用すると少し簡単に取得できます。

FOR n IN Notifier
LET usersFound = HAS(n.readed, 'user_8')
FILTER usersFound==true
RETURN n
于 2014-10-21T14:37:47.357 に答える
2

値をブール値に変換できるフィールドの存在を探しているだけの場合は、LET とサブクエリを気にする必要はありません。次のクエリは、HAS 関数を使用してドキュメント内の指定されたフィールドの存在を判断し、BOOL を使用してその値をブール表現に変換します。

LET search = 'user_8'
FOR n IN Notifier
    FILTER HAS(n.readed, search) == true && TO_BOOL(n.readed[search])
    RETURN n
于 2014-10-21T14:44:15.203 に答える