J'utilise le paquet python python pour récupérer les données d'une base de données mongodb.
>>> r = collection.find() # returns an object of class 'Cursor'
Puis je me convertis en une liste
>>> l = list(r) # returns a 'list' of 'dict'
voici ce que print (l) renvoie:
>>> [{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'_id': 1, u'name': u'name1', u'value': 11},{u'date': datetime.datetime(2013, 11, 10, 10, 45), u'_id': 2, u'name': u'name2', u'value': 22}]
Maintenant, je dois convertir en JSON pour pouvoir le manipuler.
>>> json.dumps(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.datetime(2009, 11, 12, 11, 14) is not JSON serializable
J'ai aussi essayé de suivre http://api.mongodb.org/python/1.7/api/pymongo/json_util.html sans succès: link is http://api.mongodb.org/python/current/api/bson/json_util.html
>>> json.dumps(l, default=json_util.default)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'json_util' is not defined
Remarque: je dois précisément transmettre ce résultat à R à l'aide du paquetage RPython et de sa fonction rPython :: python.get ("l").
Question secondaire: Qu'est-ce que le u (date ',' nom ', etc.) avant chaque champ de la liste de dict?
La documentation de pymongo que vous avez indiquée est obsolète. Si vous utilisez la version 1.7, je vous recommande de mettre à jour. Avec une version plus récente, vous pouvez faire ceci:
from bson.json_util import dumps
dumps(l)
http://api.mongodb.org/python/current/api/bson/json_util.html
Réponse côté: u'name'
, u'date'
, u'_id'
etc. sont les noms des champs du document dans la base de données.
from bson import json_util
json.dumps(result,default=json_util.default)
Je faisais face au même problème, j'ai écrit un code qui convertit le document en dictionnaire. Vous pouvez l'utiliser pour référence. Passez l'objet obtenu par find_one () à la méthode documentToJson () et les résultats de find () à convertDocumentsToJson. Il y a type dans le nom Json, à la place le code est converti en Dict plutôt que json.
from bson.json_util import dumps
class UtilService:
def __init__(self):
pass
@staticmethod
def pinCodeParser(path):
location = {}
f = open(path)
for line in f:
words = line.split()
location[words[1]] = (words[-3],words[-2])
return location
@staticmethod
def listHelper(str):
s = []
str = str.split(',')
for e in str:
s.append(e.replace("[","").replace("]",""))
return s
@staticmethod
def parseList(str):
if ',' in str:
return UtilService.listHelper(str)
return str
@staticmethod
def trimStr(str):
return str.replace('"','')
@staticmethod
def documentToJson(document):
document = eval(dumps(document))
mp = {}
for key, value in document.iteritems():
if "_id" in key:
mp["id"] = str(value["$oid"])
else:
mp[ UtilService.trimStr(key) ] = UtilService.parseList( value )
return mp
@staticmethod
def convertDocumentsToJson(documents):
result = []
for document in documents:
result.append(UtilService.documentToJson(document))
return result