2017-09-25 10 views
0

나는 쿼리가 정확하지만 여전히 오류라고 생각합니다.pymongo 오류 : 필터는 dict, bson.son.SON 또는 collections.Napping의 상속 유형이어야합니다. 매핑

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

그러나 find_one (findQ)가 작동합니다. 그래서 나는 잘못된 것을 발견 할 수 없다. 파이썬 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) 

이 오류는 다음과 같습니다 : 다음은 내 코드입니다 PyMongo find()는 사전 또는 bson.son 객체를 필요로하기 때문에

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

오류입니다. 전달한 것은 ({"fromid": wordid}, {"toid":1})의 형태 인 파이썬 튜플 객체입니다. 당신은 아래의 find() 메소드를 호출하여이 문제를 해결할 수 :

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

는 기술적으로 find_one() 당신의 호출 중 하나가 작동하지 않습니다. 매개 변수 필터가 find_one()으로 변경된 것입니다. find_one() L1006-1008을 참조하십시오. 기본적으로 튜플 필터의 형식을 지정합니다.

위의 값은 컬렉션에 일치하는 항목을 반환하지 않습니다.

당신이 무슨 일을하는지에 대한 대안, 당신은 예를 들어, 두 변수에 필터 매개 변수를 저장할 수 :

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