pymongo error: filter must be an instance of dict, bson.son.SON, or other type that inherits from collections.Mapping

▼魔方 西西 提交于 2019-12-11 13:36:31

问题


I think the query is correct but still an error.

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

However, find_one(findQ) works. So I can't find the wrong thing. I use python 3.6 and pymongo. Here is my 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)

This is an error:

    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

回答1:


find_one(findQ) works

The error is because PyMongo find() requires a dictionary or a bson.son object. What you have passed in is a Python tuple object is the form of ({"fromid": wordid}, {"toid":1}). You could correct this by invoking the find() method as below:

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

Technically your invocation of find_one() does not work either. It just that the parameter filter has been altered by find_one(). see find_one() L1006-1008. Which basically format your tuple filter into :

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

The above would (should) not returned any matches in your collection.

Alternative to what you're doing, you could store the filter parameter into two variables, for example:

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


来源:https://stackoverflow.com/questions/46406225/pymongo-error-filter-must-be-an-instance-of-dict-bson-son-son-or-other-type-t

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!