rrethinkdbreql

RethinkDB filtering Object Array


I'm new to rethinkdb and I wanted to filter something like... get all with Kiwi or Strawberry as preferred fruit

{
    "id":  "65dbaa34-f7d5-4a25-b01f-682032fc6e05" ,
    "fruits": {
        "favorite":  "Mango" ,
        "preferred": [
                        "Kiwi" ,
                        "Watermelon"
                    ]
    }
}

I tried something like this after reading contains doc:

r.db('appname').table('food')
 .filter(r.row('fruits').contains(function(doc) {
   return doc('preferred').contains('Kiwi');
 }))

And I'm getting a e: Cannot convert OBJECT to SEQUENCE in: error.


Solution

  • This is what you're looking for:

    r.db('appname').table('food')
      .filter((row) => { 
        r.or( // Returns true if any of the following are true
          row('fruits')('preferred').contains('Kiwi'),
          row('fruits')('preferred').contains('Strawberry')
        )   
      });
    

    You should know as well, that you can create your own index that calculates this for you, then you'd be able to do a .getAll query using your custom index and return all documents that fit this constraint very quickly.

    Lastly, for something that would also work but is probably less efficient on large arrays:

    r.db("appname").table('food')
      .filter((row) => {
        return row('fruits')('preferred').setIntersection(['Kiwi', 'Strawberry']).count().gt(0) 
      })