Mongodb find, сравнивая значения полей

Можно ли выразить следующий запрос SQL в mongodb:

SELECT * FROM table AS t WHERE t.field1 > t.filed2;

изменить Подводя итог:.

  • используя третье поле, хранящее поле "field1 - field2", почти идеально, но требует немного дополнительного обслуживания.
  • $где будет загружаться и оцениваться в JavaScript и не будет использовать какие-либо индексы. Не подходит для больших данных.
  • map/reduce имеет ту же проблему и будет проходить через все записи, даже если нам нужен только один

Ответ 1

Вы можете сделать это, используя $where:

db.coll.find( { $where: "this.field1 > this.field2" } );

Но:

Javascript выполняется медленнее, чем нативные операторы, но он очень гибкий

Если производительность является проблемой, лучше идти по пути, предложенной @yi_H.

Ответ 2

Вы можете сохранить в своем документе field1 - field2 как field3, затем выполнить поиск { field3: { $gt: 0 } }

Также можно получить соответствующие документы с mapreduce.

Ответ 3

Вы можете использовать $where. Просто имейте в виду, что он будет довольно медленным (должен выполнить Javascript-код на каждой записи), поэтому вы можете комбинировать с индексированными запросами.

db.T.find( { $where: function() { return this.Grade1 > this.Grade2 } } );

или более компактный:

db.T.find( { $where : "this.Grade1 > this.Grade2" } );