Size: a a a

2020 January 10

SM

Serge Matveenko in SPb Python
Kristina Mironova
import pymongo
from bson.objectid import ObjectId
data = list(collection.find(ObjectId('5e173e1721ffc75aba5faa0a')))

raise TypeError("%s must be an instance of dict, bson.son.SON, or "
TypeError: filter must be an instance of dict, bson.son.SON, or any other type that inherits from collections.Mapping

Что не так?
Я бы посоветовал ознакомиться с этим
https://api.mongodb.com/python/current/api/pymongo/collection.html
источник

KM

Kristina Mironova in SPb Python
Stanislav
https://pymongo.readthedocs.io/en/stable/tutorial.html#querying-by-objectid

Полагаю, что передавать надо {"_id": ObjectId(...)}, а не ObjectId
Точно!)) Спасибо тебе, добрый человек!))))
источник

S

Stanislav in SPb Python
Serge Matveenko
Я бы посоветовал ознакомиться с этим
https://api.mongodb.com/python/current/api/pymongo/collection.html
И это да, +
источник

S

Stanislav in SPb Python
Kristina Mironova
Точно!)) Спасибо тебе, добрый человек!))))
Ура :)
источник

SM

Serge Matveenko in SPb Python
Kristina Mironova
Точно!)) Спасибо тебе, добрый человек!))))
Чтение документации реально помогает. Причем не только про конкретный метод, а про то что ещё рядом есть.
Например, вам сильно поможет метод find_one, которому, как сказано в документации, можно просто передать значение, которое будет использоваться в качестве _id.
https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.find_one
Таким образом, можно делать вот так: my_collection.find_one(my_id)
Импортировать objectid будет не нужно.
Очень советую не использовать слово "collection" в коде для инстанса класса Collection, кстати.
источник

SM

Serge Matveenko in SPb Python
Serge Matveenko
Чтение документации реально помогает. Причем не только про конкретный метод, а про то что ещё рядом есть.
Например, вам сильно поможет метод find_one, которому, как сказано в документации, можно просто передать значение, которое будет использоваться в качестве _id.
https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.find_one
Таким образом, можно делать вот так: my_collection.find_one(my_id)
Импортировать objectid будет не нужно.
Очень советую не использовать слово "collection" в коде для инстанса класса Collection, кстати.
Я бы даже сам проверил, но мне с телефона неудобно
источник

S

Stanislav in SPb Python
Serge Matveenko
Я бы даже сам проверил, но мне с телефона неудобно
> a dictionary specifying the query to be performed OR any other type to be used as the value for a query for "_id".

Импортировать, видимо, все же придется. Но вызывать точно проще, если нужен только один документ.
источник

KM

Kristina Mironova in SPb Python
Serge Matveenko
Чтение документации реально помогает. Причем не только про конкретный метод, а про то что ещё рядом есть.
Например, вам сильно поможет метод find_one, которому, как сказано в документации, можно просто передать значение, которое будет использоваться в качестве _id.
https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.find_one
Таким образом, можно делать вот так: my_collection.find_one(my_id)
Импортировать objectid будет не нужно.
Очень советую не использовать слово "collection" в коде для инстанса класса Collection, кстати.
Сергей, с чтения этого ресурса я и начинала поиски. и там мне не удалось найти варианта поиска по ID. Вот такое my_collection.find_one(my_id) не работает.
источник

SM

Serge Matveenko in SPb Python
Stanislav
> a dictionary specifying the query to be performed OR any other type to be used as the value for a query for "_id".

Импортировать, видимо, все же придется. Но вызывать точно проще, если нужен только один документ.
Вангую, что просто значение можно передать, из которого оно само Objectid инстанс соберёт.
источник

KM

Kristina Mironova in SPb Python
Serge Matveenko
Вангую, что просто значение можно передать, из которого оно само Objectid инстанс соберёт.
print(collection.find_one('5e173e1721ffc75aba5faa0a'))
None
источник

S

Stanislav in SPb Python
Kristina Mironova
print(collection.find_one('5e173e1721ffc75aba5faa0a'))
None
ну это ок, не? если нет такого :)
источник

KM

Kristina Mironova in SPb Python
Stanislav
ну это ок, не? если нет такого :)
нет, это не ОК) Потому что такой айди есть. И через ОбьектИД он такое значение находит.
Но интересно было попробовать.
источник

S

Stanislav in SPb Python
Serge Matveenko
Вангую, что просто значение можно передать, из которого оно само Objectid инстанс соберёт.
Я вообще не понимаю, почему этого нет у них в драйвере и зачем так над людьми издеваться с ObjectId. Но допускаю, что могут быть причины, не смотрел.
источник

S

Stanislav in SPb Python
Может, слишком много магии смотреть, _id ли там 🤔
источник

KM

Kristina Mironova in SPb Python
Stanislav
Я вообще не понимаю, почему этого нет у них в драйвере и зачем так над людьми издеваться с ObjectId. Но допускаю, что могут быть причины, не смотрел.
судя по форумам, раньше этот обьект был частью пимонго. Но теперь нет.
источник

SM

Serge Matveenko in SPb Python
Stanislav
Я вообще не понимаю, почему этого нет у них в драйвере и зачем так над людьми издеваться с ObjectId. Но допускаю, что могут быть причины, не смотрел.
ну, вообще, создавать их вручную всё равно не нужно, обычно
типа, если у тебя есть id, то он уже правильный тип, ты же его где-то взял
источник

S

Stanislav in SPb Python
Serge Matveenko
ну, вообще, создавать их вручную всё равно не нужно, обычно
типа, если у тебя есть id, то он уже правильный тип, ты же его где-то взял
это да
источник

SM

Serge Matveenko in SPb Python
Kristina Mironova
судя по форумам, раньше этот обьект был частью пимонго. Но теперь нет.
это очень старые форумы
источник

S

Stanislav in SPb Python
А если взял из текстовых логов и что-то дебажу, то это уже мои проблемы :)
источник

SM

Serge Matveenko in SPb Python
import os

import bson
import pymongo

test_client = pymongo.MongoClient(host=os.getenv('MONGODB_HOST'))
test_db = test_client.get_database(name='test')
my_col = test_db.get_collection('my')
my_col.drop()

my_col.insert_one({'foo': 1})

print(list(my_col.find()))

id_value = '5e17a81897e04c0781596e0d'

my_col.insert_one({'_id': bson.ObjectId(id_value), 'foo': 2})

print(list(my_col.find()))

print(my_col.find_one(bson.ObjectId(id_value)))
print(my_col.find_one(id_value))

my_col.insert_one({'_id': id_value, 'foo': 3})

print(list(my_col.find()))

print(my_col.find_one(bson.ObjectId(id_value)))
print(my_col.find_one(id_value))

да, таки надо явно

app_1      | [{'_id': ObjectId('5e17aaadc02f935d421ae525'), 'foo': 1}]
app_1      | [{'_id': ObjectId('5e17aaadc02f935d421ae525'), 'foo': 1}, {'_id': ObjectId('5e17a81897e04c0781596e0d'), 'foo': 2}]
app_1      | {'_id': ObjectId('5e17a81897e04c0781596e0d'), 'foo': 2}
app_1      | None
app_1      | [{'_id': ObjectId('5e17aaadc02f935d421ae525'), 'foo': 1}, {'_id': ObjectId('5e17a81897e04c0781596e0d'), 'foo': 2}, {'_id': '5e17a81897e04c0781596e0d', 'foo': 3}]
app_1      | {'_id': ObjectId('5e17a81897e04c0781596e0d'), 'foo': 2}
app_1      | {'_id': '5e17a81897e04c0781596e0d', 'foo': 3}


и третий документ нам показывает почему так
источник