2012-09-15 19 views
6

pymongo me tira un error al intentar consultar y el elemento de tagscómo consultar un elemento de una lista en pymongo

db.users.find({"pseudo":"alucaard"}).distinct("produit_up") 
Out[1]: 
[{u'abus': 0, 
    u'avctype': u'image/jpeg', 
    u'date': u'2012-09-15', 
    u'description': u'le fameux portable solide', 
    u'id': u'alucaard134766932677', 
    u'namep': u'nokia 3310', 
    u'nombre': 1, 
    u'orientation': u'portrait', 
    u'photo': ObjectId('5053cd4e3a5f3a0990da8a61'), 
    u'prix': 1000, 
    u'tags': [u'solide', u'le', u'fameux', u'portable'], 
    u'vendu': False}] 

list(db.users.find({"solide":{"$in":{"document_up.tags"}}})) 

Traceback (most recent call last): 
File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 2746, in run_code exec code_obj in self.user_global_ns, self.user_ns 
File "<ipython-input-1-8dff98261d7a>", line 1, in <module> 
list(db.users.find({"solide":{"$in":{"document_up.tags"}}})) 
File "C:\Python27\lib\site-packages\pymongo\cursor.py", line 778, in next 
if len(self.__data) or self._refresh(): 
File "C:\Python27\lib\site-packages\pymongo\cursor.py", line 729, in _refresh 
self.__uuid_subtype)) 
InvalidDocument: Cannot encode object: set(['document_up.tags']) 

NB: sólo un truco para los usuarios pymongo, si los usuarios tienen un tamaño limitado en el texto, simplemente convertirlo usando un conjunto, el convertir el conjunto a una lista: por ejemplo:

phrase = "hi you, how are you, am i using this" 
  1. primer paso: quitar comas o puntos para evitar searc expresión regular hs.
  2. segundo, use phrase.split() para dividir palabras.
  3. agréguela a set para evitar palabras duplicadas.
  4. convertir el conjunto a un list
  5. que será una buena idea hacer una dictionnary que contiene algunas palabras que se eliminarán de la lista, al igual que el "cómo", "usted", "yo", ... pero hará muchos cálculos.

Espero que esta idea ayude.

Respuesta

22

Su consulta es errónea. Intente algo más cerca de:

list(db.users.find({"document_up.tags":{"$in":["solide"]}})) 
+0

así que fue el inverso ?! porque en lógica, buscamos una palabra si está en una lista, y no una lista si está en una palabra? –

+2

@AbdelouahabPp De hecho, en Mongo es muy parecido a SQL de esta manera con 'field_name IN (1,2,3)' – Sammaye

+0

lo siento porque "salte" directamente a nosql, dident obtuvo el paso sql: p gracias de nuevo –

Cuestiones relacionadas