Hey buddy,
long story short;
- Which is more efficient? $or with { $gte } + { $exists: false }, because each branch can use its own index.
- Does $not behave differently with missing fields? Yes. $not matches >= 18, and missing, null, or non-numeric values — it’s broader than $or.
- Which scales better with compound indexes? $or scales better. You can tune each branch with its own (possibly partial) index. $not usually can’t take advantage of compound indexes efficiently.