2012-05-24 5 views
3

Я пытаюсь фильтровать MongoDB документы по своим полям, в частности, время, то есть:Фильтрация в MongoDB с собственными полями

{time1: timeval1, time2: timeval2} 

Я хочу, чтобы иметь возможность получить набор результатов (например, с .find()), где timeval1 больше, чем timeval2.

Я не знаю, как это сделать с помощью $ gt и не мог найти ничего подобного. Есть идеи, как это сделать?

Я получаю доступ к нему из pymongo внутри проекта djangi ... но все, что я хочу, это запрос mongodb.

ответ

3

Вы можете использовать оператор $where и выражение javascript, чтобы написать логику запроса.

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

> db.newColl.find() 

{ "_id" : ObjectId("4fbdcdd6e79d66d9e681b185"), "time1" : 123, "time2" : 22 } 
{ "_id" : ObjectId("4fbdcddee79d66d9e681b186"), "time1" : 11, "time2" : 220 } 
{ "_id" : ObjectId("4fbdcde6e79d66d9e681b187"), "time1" : 331, "time2" : 2120 } 
{ "_id" : ObjectId("4fbdcdece79d66d9e681b188"), "time1" : 1, "time2" : 20 } 

> db.newColl.find({'$where' : 'this.time1 > this.time2' }); 

{ "_id" : ObjectId("4fbdcdd6e79d66d9e681b185"), "time1" : 123, "time2" : 22 } 


> db.newColl.find({'$where' : 'this.time1 < this.time2' }); 

{ "_id" : ObjectId("4fbdcddee79d66d9e681b186"), "time1" : 11, "time2" : 220 } 
{ "_id" : ObjectId("4fbdcde6e79d66d9e681b187"), "time1" : 331, "time2" : 2120 } 
{ "_id" : ObjectId("4fbdcdece79d66d9e681b188"), "time1" : 1, "time2" : 20 } 

+2

При использовании $, где это хорошо, чтобы быть в курсе, что его производительность намного хуже, чем "нормальные" запросы. Из руководства mongodb: «Используйте $, где только тогда, когда вам нужно, это значительно медленнее». Связанный совет состоит в том, чтобы попытаться фильтровать результирующий набор с обычными выражениями запроса, насколько это возможно, до $ where, чтобы сократить количество документов, обрабатываемых $ where. – jhonkola

Смежные вопросы