Хорошо, это может быть немного сложно визуализировать без публикации примера рассматриваемой спецификации документа, но я не уверен, что это даже уместно в этом случае.
По сути, то, что я пытаюсь сделать здесь, это $pull
выделение определенной части документа из списка идентификаторов записей. Вот пример (мы используем PyMongo для взаимодействия с базой данных):
distinct_poster_ids = self._db.activities.find({"_id": activity_id}).distinct("feed.poster_id")
if distinct_poster_ids:
document = {
"$pull": {
"feed": {
"_id": activity_id,
"object": "activity"
}
}
}
self._db.posters.update({"_id": {"$in": distinct_poster_ids}}, document, multi=True)
То, что я пытаюсь сделать здесь, это удалить «активность» из каналов «постеров», которые участвовали в указанной «деятельности». Итак, я извлекаю идентификаторы всех «постеров» из «действия», а затем использую этот список в предложении $in
оператора update
. Затем я пытаюсь $pull
выделить соответствующие части поддокумента "Постеры".
Проблема здесь в том, что он применяет это изменение только к первому элементу в списке или к первому «постеру». Насколько я знаю, синтаксис правильный, но это может быть крайний случай.
Я могу лениво пройтись по списку и применить этот оператор к каждому идентификатору в отдельности, но Я бы предпочел разгрузить его в БД, если он его поддерживает.
Как всегда, большое спасибо!
Edit:
Установите Mongod на максимальную степень детализации -vvvvvv
и извлекайте следующую запись из журналов, которые соответствуют вызову PyMongo:
update posters query: { _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } } update: { $pull: { feed: { _id: "4020800", object: "activity" } } }
Затем я вошел в оболочку и выполнил обновление вручную:
db.posters.update({ _id: { $in: [ "1", "10", "18537", "19778", "20137", "20967", "4", "54", "5835", "9" ] } }, { $pull: { feed: { _id: "4020800", object: "activity" } } })
Я проверил поврежденные записи в оболочке, и она отлично работала. Я думаю, что это может быть крайний случай или ограничение в привязках PyMongo. Во всяком случае, если кто-то может пролить свет на это, я был бы очень рад!