In Firebase, you can query a single value or a range of values, so creating a single query to retrieve elements matching multiple keywords will not be possible. However, you can organize your database so that you can easily query for a single keyword. Then you need to combine several queries, etc.
You can organize your data as follows:
{ "items": { "item1_id": { "brand_id": ..., "itemName": ..., "price": ..., "keywords": { "black": true, "t-shirt": true } } } }
However, as explained in this answer , you will need to define an index for each keyword. To provide effective keyword-based queries, you can create your own keyword mapping with elements:
{ "items": { "item1_id": { "brand_id": ..., "itemName": ..., "price": ..., "keywords": { "black": true, "t-shirt": true } } }, "keywords": { "black": { "item1_id": true }, "t-shirt": { "item1_id": true } } }
The query for the keyword would be something like this:
let keyword = "black"; database.ref(`keywords/${keyword}`).once("value", (snapshot) => { snapshot.forEach((idSnapshot) => { database.ref(`items/${idSnapshot.key}`).once("value", (itemSnapshot) => { console.log(JSON.stringify(itemSnapshot.val())); }); }); });
The need to maintain your own matching of keywords with elements is a bit painful, but queries will be fast. In addition, multi-user Firebase updates can facilitate support for keyword matching. To create an item:
database.ref().update({ "items/item1_id": { "brand_id": ..., "itemName": ..., "price": ..., "keywords": { "black": true, "t-shirt": true } }, "keywords/black/item1_id": true, "keywords/t-shirt/item1_id": true });
To change the keywords of an element (remove black , add blue and leave the t-shirt untouched):
database.ref().update({ "items/item1_id/keywords": { "black": null, "blue": true }, "keywords/black/item1_id": null, "keywords/blue/item1_id": true });
And to remove the item:
database.ref().update({ "items/item1_id": null, "keywords/blue/item1_id": null, "keywords/t-shirt/item1_id": null });