2014-11-21 52 views
1

我正在使用交易作为嵌入式文档的Credits模式。以下是存储它的结构。如何在mongoengine中过滤EmbeddedDocument并获得字段值?

{ 
    "_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

由于u想最后一次成功存入交易,这一切做的工作

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 – 2014-11-21 14:18:59

1

如果我正确地理解了您的话,您在使用嵌入式文档中的字段查询时遇到问题。您可以使用双下划线来查询嵌套字段。此外,您应该使用filter()而不是get(),因为het旨在用于仅匹配单个文档的查询(并且如果找到多个文档,实际上会返回错误)。

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 
相关问题