2017-09-25 4 views
0

Je pense que la requête est correcte mais reste une erreur.Erreur pymongo: le filtre doit être une instance de dict, bson.son.SON ou un autre type qui hérite de collections.Mapping

findQ = {"fromid": wordid}, {"toid":1}   
    res= self.db.wordhidden.find(findQ) 

Cependant, find_one (findQ) fonctionne. Donc, je ne peux pas trouver la mauvaise chose. J'utilise python 3.6 et pymongo. Voici mon code:

def getallhiddenids(self,wordids,urlids): 
    l1={} 
    for wordid in wordids: 
    findQ = {"fromid": wordid}, {"toid":1} 
    res= self.db.wordhidden.find(findQ) 
    for row in res: l1[row[0]]=1 
    for urlid in urlids: 
    findQ = {"toid": urlid}, {"fromid":1} 
    res= self.db.hiddenurl.find(findQ) 

Ceci est une erreur:

Traceback (most recent call last): 
    File "C:\Users\green\Desktop\example.py", line 9, in <module> 
    neuralnet.trainquery([online], possible, notspam) 
    File "C:\Users\green\Desktop\nn.py", line 177, in trainquery 
    self.setupnetwork(wordids,urlids) 
    File "C:\Users\green\Desktop\nn.py", line 105, in setupnetwork 
    self.hiddenids=self.getallhiddenids(wordids,urlids) 
    File "C:\Users\green\Desktop\nn.py", line 93, in getallhiddenids 
    res= self.db.wordhidden.find(findQ) 
    File "C:\Users\green\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\pymongo\collection.py", line 1279, in find 
    return Cursor(self, *args, **kwargs) 
    File "C:\Users\green\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\pymongo\cursor.py", line 128, in __init__ 
    validate_is_mapping("filter", spec) 
    File "C:\Users\green\AppData\Local\Programs\Python\Python36-32\lib\site- 
packages\pymongo\common.py", line 400, in validate_is_mapping 
    "collections.Mapping" % (option,)) 
TypeError: filter must be an instance of dict, bson.son.SON, or other type 
that inherits from collections.Mapping 
+0

Je sais très peu de choses sur pymongo. Cela dit, findQ est un tuple. Pouvez-vous passer un tuple à la méthode find()? –

Répondre

0

find_one(findQ) works

L'erreur est parce que PyMongo find() nécessite un dictionnaire ou un objet bson.son. Ce que vous avez passé est un objet tuple Python est la forme de ({"fromid": wordid}, {"toid":1}). Vous pouvez corriger cela en invoquant la méthode find() comme ci-dessous:

db.wordhidden.find({"fromid": wordid}, {"toid": 1}) 

Techniquement votre invocation de find_one() ne fonctionne pas non plus. C'est juste que le filtre de paramètre a été modifié par find_one(). voir find_one() L1006-1008. Qui fondamentalement formater votre filtre de tuple dans:

{'_id': ({"fromid": wordid}, {"toid":1}) } 

Ce qui précède (ne devrait pas) retourné des allumettes dans votre collection.

Alternative à ce que vous faites, vous pouvez stocker le paramètre de filtre dans deux variables, par exemple:

filterQ = {"fromid": wordid} 
projectionQ = {"toid": 1} 
cursor = db.wordhidden.find(filterQ, projectionQ)