                     'selector._id.*DOLLAR*in': $in: [instanceId]
                 ]
 
-            addClauses = (selectorPrefix, oldSubValues, newSubValues) =>
+            # We'll collect all the changed subFieldNames for later
+            changedSubFieldSpecSet = {} # changedSubFieldSpec: true
+
+            addSelectorClauses = (fieldSpecPrefix, oldSubValues, newSubValues) =>
+                ###
+                    1. Append clauses to subFieldSelectorMatcher so it restricts the
+                       set of matched watchers to ones that ever returned this doc.
+
+                    2. Mutate changedSubFieldNameSet for later
+                ###
+
                 # TODO: Handle more selectors besides just default (equality) and $in
                 # e.g. $gt, $gte, $lt, $lte
 

                    subFieldNameSet[subFieldName] = true

                for subFieldName of subFieldNameSet
                    if selectorPrefix is 'selector'
                        selectorPath = "selector.#{J.Model.escapeDot subFieldName}"
                    else
                        selectorPath = "#{selectorPrefix}*DOT*#{J.Model.escapeDot subFieldName}"

                    oldValue = oldSubValues[subFieldName]
                    newValue = newSubValues[subFieldName]

                    term = $or: [{}, {}]
                    term.$or[0][selectorPath] =
                        $in: [null]
                    term.$or[1]["#{selectorPath}.*DOLLAR*in"] =
                        $elemMatch: $in: []

                    if oldValue?
                        term.$or[0][selectorPath].$in.push oldValue
                        term.$or[1]["#{selectorPath}.*DOLLAR*in"].$elemMatch.$in.push oldValue
                        if _.isArray oldValue then for elem in oldValue
                            term.$or[0][selectorPath].$in.push elem
                            term.$or[1]["#{selectorPath}.*DOLLAR*in"].$elemMatch.$in.push elem
                    if newValue? and not EJSON.equals oldValue, newValue
                        term.$or[0][selectorPath].$in.push newValue
                        term.$or[1]["#{selectorPath}.*DOLLAR*in"].$elemMatch.$in.push newValue
                        if _.isArray newValue then for elem in newValue
                            term.$or[0][selectorPath].$in.push elem
                            term.$or[1]["#{selectorPath}.*DOLLAR*in"].$elemMatch.$in.push elem

                    subFieldSelectorMatcher.push term

                    if J.util.isPlainObject(oldValue) or J.util.isPlainObject(newValue)
                        addClauses(
                            selectorPath
                            if J.util.isPlainObject(oldValue) then oldValue else {}
                            if J.util.isPlainObject(newValue) then newValue else {}
                        )

            addClauses 'selector', mutableOldValues, mutableNewValues

            watcherMatcher =
                modelName: modelName
                $or: [
                    selector: $in: [null, instanceId]
                ,
                    $and: subFieldSelectorMatcher
                ]

            # TODO: Add this to watcherMatcher:
            #   fields: // smart logic that rules out watchers that
            #              don't care about any of the fields that
            #              were changed from oldValues to newValues

            watcherMatcher


                        if numWatchersReset
                            console.log "    <#{watcherModelName}>.#{watcherReactiveName}:
                                #{numWatchersReset} watchers reset"
                            console.log "selector: #{JSON.stringify selector, null, 4}"
            )


