Можно ли переключить дивиденд и делитель оператора MongoDB $mod query?

MongoDB $mod query operator предоставляет способ выбора документов, где значение V поля, деленного на делитель D, имеет указанный остаток R Поэтому он выбирает документы, где V mod D равно R.

Мне нужно переключить дивиденд и делитель операции modulo. Другими словами, мне нужно выбрать документы, где предоставленный дивиденд D, деленный на значение V поля, имеет указанный остаток R. Поэтому мне нужно выбрать документы, где D mod V равно R.

Можно ли переключить дивиденд и делитель оператора запроса MongoDB $mod? Если нет, возможно ли передать запрос пользовательскую функцию, которая позаботится об этом?

Ответ 1

Регулярный .find запрос с $modОператор a > не будет работать здесь, но все же вы можете сделать это, используя структуру агрегации и $redact и $mod арифметический оператор агрегации.

Предположим, что в нашей коллекции есть следующие документы:

{ "_id" : ObjectId("573f624b4c01ce47a183a632"), "a" : 4 },
{ "_id" : ObjectId("573f63494c01ce47a183a634"), "a" : 12 },
{ "_id" : ObjectId("573f63504c01ce47a183a635"), "a" : 6 },
{ "_id" : ObjectId("573f63504c01ce47a183a636"), "a" : 24 }

Следующий запрос возвращает все те документы, где 60 по модулю значение поля a равно 0.

db.collection.aggregate([
    { "$redact": { 
        "$cond": [ 
            { "$eq": [ {"$mod": [ 60, "$a" ] }, 0 ] }, 
            "$$KEEP", 
            "$$PRUNE"
        ]
    }}
])

который производит:

{ "_id" : ObjectId("573f624b4c01ce47a183a632"), "a" : 4 }
{ "_id" : ObjectId("573f63494c01ce47a183a634"), "a" : 12 }
{ "_id" : ObjectId("573f63504c01ce47a183a635"), "a" : 6 }

Другим, вероятно, менее эффективным способом сделать это, является использование оператора $where.

db.collection.find("60 % this.a === 0")