title: Convert mongodb return object to dictionary
body: <p>I'm using the bottle framework together with mongoengine.
  I have an orders model :</p>
  
  <pre><code>class OrderDetail(Option):
      orderDetailsQty = FloatField()
  
      def to_dict(self):
          return mongo_to_dict_helper(self)
  
  
  class Order(Document):
      userName = StringField(required=True)
      orderDate = DateTimeField()
      orderStatus = ListField(EmbeddedDocumentField(Status))
      orderDetails = ListField(EmbeddedDocumentField(OrderDetail))
      orderComments = ListField(EmbeddedDocumentField(Comment))
      isActive = BooleanField()
  
      def to_dict(self):
          orderObj = mongo_to_dict_helper(self)
          orderDetailList = []
          for orderDetail in orderObj["orderDetails"]:
              orderDetailList.append(orderDetail.__dict__)
          orderObj["OrderDetails"] = orderDetailList
          return (self)
  </code></pre>
  
  <p>When mongodb is queried I get an object which is then converted in to a dict by using the following function :</p>
  
  <pre><code>def mongo_to_dict_helper(obj):
      return_data = []
      for field_name in obj._fields:
          if field_name in ("id",):
              continue
          data = obj._data[field_name]
  
          if isinstance(obj._fields[field_name], StringField):
              return_data.append((field_name, str(data)))
          elif isinstance(obj._fields[field_name], FloatField):
              return_data.append((field_name, float(data)))
          elif isinstance(obj._fields[field_name], IntField):
              return_data.append((field_name, int(data)))
          elif isinstance(obj._fields[field_name], ListField):
              return_data.append((field_name, int(data)))
          else:
              # You can define your logic for returning elements
              pass
      return dict(return_data)
  </code></pre>
  
  <p>I found this function after a long search in the internet. Later found out that this function also fails while defining a member as the ListField(EmbeddedDocumentField(obj)).</p>
  
  <p>I also tried writing a condition for catching the specific case of EmbeddedDocumentField :</p>
  
  <pre><code>elif isinstance(obj._fields[field_name], EmbeddedDocumentField):
      return_data.append(mongo_to_dict_helper(data))
  </code></pre>
  
  <p>but that didn't do any good either.</p>
  
  <p>Anyone have a workaround for this issue ?</p>