Woppi Woppi - 2 months ago 34
R Question

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.

Answer

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 contrainst 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) 
  })
Comments