React NativeでRealmのfilterをいい感じで使う

filterは以下のような感じで使います。1つ目の引数はqueryの文字列になります。文字列内に$0,$1…を指定することで、2番目以降の引数が呼ばれるようになります。

realm.objects('Message').filtered('roomId == $0', roomId, );

以下のようなケースはうまくfilterが効きませんでした。

ケース1:文字列として判別させる

realm.objects('Message').filtered('roomId == "$0"', roomId, );

ケース2:クエリの左辺を変数化する

realm.objects('Message').filtered('$0 == $1', 'roomId', roomId, );

数字のoperators ==, !=, >, >=, <, and <=

Stringのoperators ==, BEGINSWITH, ENDSWITH, and CONTAINS とかいてありますが、

例では == ではなく = になっていて大変謎です。

let tanDogs = dogs.filtered('color = "tan" AND name BEGINSWITH "B"');

最終的に以下のようにすることで安定しました。

realm.objects('Message').filtered('roomId == $0', Number(roomId), );

参考

https://github.com/realm/realm-js/blob/master/docs/tutorials/query-language.md

https://realm.io/jp/docs/javascript/latest/#section-19

https://realm.io/docs/javascript/latest/api/Realm.Collection.html#filtered