Запрос для поиска вложенного словаря в pymongo

#python #mongodb #pymongo

#python #mongodb #pymongo

Вопрос:

У меня есть вложенный словарь, который я вставил в свою коллекцию

 data={'name': {'animal': {'lion': 2, 'tiger': 1}}}
data1={'name': {'plant': {'herb': 2, 'tree': 1}}}
collection.insert_one(data)
collection.insert_one(data1)

collection.find({})
  

Он выдает мне результат как.

 [{'_id': ObjectId('5fabab4c959bc806cd129d6a'),
  'name': {'plant': {'herb': 2, 'tree': 1}}},
 {'_id': ObjectId('5fabb0a2959bc806cd129d6b'),
  'name': {'animal': {'lion': 2, 'tiger': 1}}}]
  

У меня есть два списка, один из которых — имя, а другой — токен.

 name=["animal","ocean"]
token=["fish","desert","lion"]
  

Теперь мой запрос заключается в том, что сначала я проверю, присутствует ли имя в нашей коллекции или нет, если имя отсутствует, мы просто вставляем словарь в коллекцию следующим образом. (ocean отсутствует в коллекции)

 data={'name': {'ocean': {'fish': 1, 'desert': 1,"lion":1}}}
collection.insert_one(data)
  

если имя присутствует в нашей коллекции, то мы проверим, сколько токенов присутствует, если токен присутствует, мы увеличим его количество, иначе это будет так для animal, которое мы вставим.

 data={'name': {'animal': {'fish': 1, 'desert': 1,"lion":2}}}
  

Мое решение заключается в том, что сначала проверьте, присутствует ли имя в коллекции или нет, если оно присутствует, а затем просто извлеките его и обновите, выполнив итерацию по словарю.
Я попытался проверить, присутствует ли имя или нет.

 list(collection.find({"name.1":"animal"}))
  

Но это дает мне пустой список. Каков правильный способ решения запроса?

Ответ №1:

Если вы хотите проверить, существует ли ключ в объекте, используйте $exists оператор:

 list(collection.find({"name.animal": {"$exists": True}}))