2017-09-25 5 views
0

私はクエリが正しいと思うが、それでもエラーです。pymongoエラー:filterはdict、bson.son.SON、またはcollections.Mappingから継承する他の型のインスタンスでなければなりません。

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

ただし、find_one(findQ)が機能します。だから私は間違ったことを見つけることができません。 私はpython 3.6とpymongoを使用します。ここ は私のコードです:

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) 

これはエラーです:

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

私はpymongoについてほとんど知りません。つまり、findQはタプルです。 find()メソッドにタプルを渡すことはできますか? –

答えて

0

find_one(findQ) works

PyMongo find()は、辞書やbson.sonオブジェクトを必要とするため、エラーがあります。あなたが渡したのは、Pythonタプルオブジェクトが({"fromid": wordid}, {"toid":1})という形式です。あなたは以下のようにfind()メソッドを呼び出すことによってこれを修正することができます:

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

技術的find_one()のあなたの呼び出しはどちらか動作しません。パラメータフィルタがfind_one()で変更されただけです。 find_one() L1006-1008を参照してください。基本的にタプルフィルタの書式を設定します。

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

上記はあなたのコレクションに一致するものは返されませんでした。何をやっている、あなたは例えば、二つの変数にフィルタパラメータを格納することができへ

オルタナティブ:

filterQ = {"fromid": wordid} 
projectionQ = {"toid": 1} 
cursor = db.wordhidden.find(filterQ, projectionQ) 
関連する問題