Я получаю эту ошибку TypeError: фильтр должен быть экземпляром dict, bson.son.SON или другого типа, который наследуется от коллекций. - PullRequest
0 голосов
/ 22 апреля 2019

Я извлекаю последние сохраненные данные в текстовое поле, чтобы пользователь мог продолжить то, над чем он работал ранее, эта команда прекрасно работает в консоли mongo, в PyCharm я не могу найти правильный способ написать find () запрос

Я попытался сохранить параметры фильтра в 2-х отдельных переменных, как предложено здесь ошибка pymongo: фильтр должен быть экземпляром dict, bson.son.SON или другого типа, который наследуется от коллекций. Отображение

Database.initialize()
db_data = Database.find(collection = 'notes_temp', 
                         query = ({"priority" : self.priority}, {'td': 1, '_id':0}))
        for task in db_data:
            self.t.insert('insert linestart', task)

модуль базы данных

class Database:
    URI = "mongodb://127.0.0.1:27017"
    DATABASE = None

    @staticmethod
    def initialize():
        client = pymongo.MongoClient(Database.URI)
        Database.DATABASE = client['notes']
    @staticmethod
    def find(collection, query):
        return Database.DATABASE[collection].find(query)

1 Ответ

1 голос
/ 22 апреля 2019

Проблема в том, что ваш запрос определен как:

({"priority" : self.priority}, {'td': 1, '_id':0}))

, поэтому, когда ваша функция получает его в качестве входных данных, она анализируется как:

return Database.DATABASE[collection].find(({"priority" : self.priority}, {'td': 1, '_id':0})))

По сути, есть дополнительная пара скобок, которыедолжны быть удалены.

Решение макета: (очевидно, есть несколько способов решить эту проблему)

Database.initialize()
db_data = Database.find(collection = 'notes_temp', 
                         query = {"priority" : self.priority}, projection = {'td': 1, '_id':0})
        for task in db_data:
            self.t.insert('insert linestart', task)

class Database:
    URI = "mongodb://127.0.0.1:27017"
    DATABASE = None

    @staticmethod
    def initialize():
        client = pymongo.MongoClient(Database.URI)
        Database.DATABASE = client['notes']
    @staticmethod
    def find(collection, query, projection):
        return Database.DATABASE[collection].find(query, projection)
...