pyMongo удалить / изменить найденные документы - PullRequest
0 голосов
/ 21 февраля 2019

Написание функции, которая находит документы и, если «delete == True», то удаляет их.

Есть ли способ удалить документы, которые являются результатом операции «.find»?

    def findOrphanSensors(self, delete = False):
       deviceList = sorted(self._dbC.devicesCol.find({}).distinct('_id'))
       print(deviceList)
       orphanSensors = self._dbC.sensorsCol.find({'parentDeviceID':{'$nin':deviceList}})
       print(orphanSensors.count())
       if delete == True:
          orphanSensors.remove() ???

Я могу сделать:

    if delete == True:
        self._dbC.sensorsCol.deleteMany({'parentDeviceID': {'$nin': deviceList}})

, но я думаю, что если у меня уже есть результат поиска в "orphanSensors", тогда нет необходимости повторять поиск ...?

1 Ответ

0 голосов
/ 21 февраля 2019

Да, вы можете.Результат find может быть повторен.

for orphan in orphanSensors:
  self._dbC.sensorsCol.deleteOne(orphan['_id'])

Однако это может быть не так эффективно, как вызов delete_many().Если вам не нужно печатать количество сирот, прежде чем вы их удалите, вы можете изменить свой код следующим образом:

def findOrphanSensors(self, delete = False):
  deviceList = sorted(self._dbC.devicesCol.distinct('_id'))
  print(deviceList)
  orphan_filter = {'parentDeviceID':{'$nin':deviceList}}
  if delete:
    result = self._dbC.sensorsCol.delete_many(orphan_filter)
    print(result.deleted_count)
  else:
    result = self._dbC.sensorsCol.find(orphanFilter)
    print(result.count())
...