2014-11-21 2 views
1

Я работаю над моделью Credits с транзакциями как встроенные документы. Ниже находится структура, в которой она хранится.Как фильтровать EmbeddedDocument в mongoengine и получать значение поля?

{ 
    "_id" : ObjectId("546dae8cc09e5f0d9602e632"), 
    "user" : ObjectId("53e7fdaac09e5f12a1230c14"), 
    "transaction" : [ 
     { 
      "date" : ISODate("2014-11-20T12:34:12.878Z"), 
      "amount" : 100, 
      "follow_num" : "d5571d91-e434-4b10-bbd8-2a6511e78011", 
      "memo" : "test1", 
      "trans_type" : "deposit", 
      "status" : "success" 
     }, 
     { 
      "date" : ISODate("2014-11-20T13:03:49.851Z"), 
      "amount" : 500, 
      "follow_num" : "2fd57cf4-eb5d-4751-9c88-6158adda6572", 
      "memo" : "test2", 
      "trans_type" : "withdraw", 
      "status" : "failed" 
     }, 
     { 
      "date" : ISODate("2014-11-20T22:54:19.892Z"), 
      "amount" : 20, 
      "follow_num" : "c2bd7dd2-3b17-41c2-9513-60a058a5622a", 
      "memo" : "test3", 
      "trans_type" : "deposit", 
      "status" : "success" 
     } 
    ] 
} 

Я хочу, чтобы получить количество последней успешной операции депозитного (т.е. transaction.trans_type = «депозит» и transaction.status = «успех»).

@property 
def last_deposit(self): 
    credit_obj = Credits.objects.get(user=self, 
           transaction__match={"trans_type":"deposit","status":"success"}) 

ответ

1

Так как и хотел только количество последней успешной операции депозита это будет делать работу

import pymongo 

c=pymongo.Connection(host="localhost",port=27017) 

db=c["family"] 

i= db.tran.aggregate([ { "$unwind":"$transaction"}, {"$match": {"$and":[{"transaction.status":"success" , "transaction.trans_type":"deposit"}]}},{"$sort":{"date":-1}},{"$limit":1}]) 

a=i["result"] 

a=a[0] 

b=a['transaction'] 

print b['amount'] 

Что я сделал: подключен к локальной MongoDB семьи база данных в trans коллекции сделали агрегированную функцию, чтобы получить внедренный документ, в котором я нашел значение для суммы ключей из словаря, полученного из запроса

+0

Спасибо, но я хочу использовать MongoEngine –

1

Если вы правильно поняли, у вас возникли проблемы с использованием полей внутри встроенного документа для запросов. Вы можете использовать двойное подчеркивание для запроса вложенных полей. Кроме того, вы должны использовать filter() вместо get(), так как он предназначен для запросов, которые будут соответствовать только одному документу (и будут фактически возвращать ошибку, если найдено несколько документов).

credit_obj = Credits.objects.filter(
    user=user_id, 
    transaction__trans_type="deposit", 
    transaction__status="success" 
).order_by('-transaction__date').first() 

Кроме того, если вы используете get() вы должны поймать возможные исключения.

from mongoengine.errors import DoesNotExist, MultipleObjectsReturned 
from bson.errors import InvalidId 

try: 
    credit_obj = Credits.objects.get(
    user=user_id, 
) 

# verify that user_id is a valid ObjectID 
except InvalidId: 
    print "Not a valid ObjectId: '%s'." % str(user_id) 
    # code to handle error 

except DoesNotExist, e: 
    print "Could not get '%s'. Error: %s" % (user_id, e) 
    # code to handle error 

except MultipleObjectsReturned: 
    print "Multiple objects matched query." 
    # code to handle error 
Смежные вопросы