2015-09-24 3 views
2
class News(Document): 
    news_id = IntField() 
    post_date = DatetimeField() 
    last_modified = DatetimeField() 

Это документMongoengine запросов для сравнения одного поля к другому

Я хочу, чтобы сделать запрос, где mongoengine LAST_MODIFIED больше POST_DATE

Что-то вроде

News.objects (last_modified__gte = POST_DATE) #mongoengine query

Есть ли способ сделать этот тип запроса?

+0

Вы проверили документацию для двигателя монго? http://docs.mongoengine.org/guide/querying.html#query-operators – theWanderer4865

+0

Попробуйте с 'News.objects (last_modified__gte = F ('post_date'))' – Pynchia

+0

Что такое 'F' здесь? он говорит, что F не определен 'NameError' –

ответ

-1

В Джанго вы могли бы сделать это с F, но так как F не работает с mongoengine использовать where

ме-
query = "this.{last_modified}>this.{post_date}" 

db_fields = { 
    'last_modified': News._fields['last_modified'], 
    'post_date': News._fields['post_date'] 
} 

results = News.objects.where(query.format(*db_fields)) 

Согласно mongoengine документации, '$, где' оговорка подставляется автоматически

def where(self, where_clause): 
"""Filter ``QuerySet`` results with a ``$where`` clause (a Javascript 
    expression). Performs automatic field name substitution like 
    :meth:`mongoengine.queryset.Queryset.exec_js`. 

    .. note:: When using this mode of query, the database will call your 
       function, or evaluate your predicate clause, for each object 
       in the collection. 

    .. versionadded:: 0.5 
    """ 

OR

Вы могли бы чень MongoDB непосредственно -

query = "this.{last_modified}>this.{post_date}" 

db_fields = { 
    'last_modified': News._fields['last_modified'], 
    'post_date': News._fields['post_date'] 
} 

collection = News._get_collection() 

results = list(collection.find({"$where": query.format(*db_fields)})) 

Примечание: - Вы не должны жёстко db_fields имя в ваших Монго запросов.

+0

Поскольку '$ where' использует JavaScript непосредственно на сервере, тогда поля должны быть указаны только в нотации JavaScript. Если вы получили обозначение правильно, это должно быть правильно. Вопрос вводит в заблуждение от использования «равного» оператора, когда они спрашивают «больше». –

+0

Я изменил свой ответ, пожалуйста, посмотрите, подходит ли это вам – hspandher

+1

. Отбросьте интерполяцию, поскольку она не нужна. '" $ where ":" this.last_modified> this.post_date ". Нет необходимости в хитрости python. Это JavaScript. Но я также проголосовал, поскольку принцип в основном правильный. Однако попытка заменить строковые значения приведет к сбою. –