Reformulating definitions can help you find a simple implementation. What do I mean?
Let's illustrate with an example from probability. Given the chance of winning the lottery is 0.1%, what is the chance of winning the lottery at least once if I play 10 times?
There is a complicated way to calculate this probability or a simpler way if you reformulate the question:
- The probability of winning at least once = 1 - the probability of never winning
Calculating the probability of never winning is simple. You need to lose every time you play. That's 99.9%^10. Therefore:
- The probability of winning at least once = 1 - 99.9%^10
You can apply this principle in programming as well! I had to write a method that returned only the orders for which the products were in stock. If an order had a Gameboy color and there was no Gameboy color in stock I needed to exclude it.
Redefining the selection criterium made it very easy to implement:
- Original selection criterium: order with products in stock
- Equivalent selection criterium: order without any products that are out of stock
This second selection criterium was much easier to implement. The solution in MongoDB:
db.orders.find({
'order_lines.product_id' : {$nin: get_ids_of_products_out_of_stock()}
})