在Python/Mongoengine中使用pull_all和push_all

1 投票
1 回答
1165 浏览
提问于 2025-04-17 13:27

我在Mongo数据库里有一个对象:

mystuff = ListField(ReferenceField(Asset, dbref=True))

我有一个Python方法,目的是要 更新 这个Mongo对象,把它的 mystuff 列表字段的值前面加上一个给定的值。因为Mongoengine目前还没有办法在列表的特定位置插入一个对象(而且他们把这个功能的优先级定得很低),所以我尝试了以下步骤:

  1. 把当前列表的内容保存到一个临时变量(oldlist)里。
  2. 使用“pull_all”这个修改器来 更新 数据库条目,把 mystuff 列表清空(这个修改器是 mongoengine的一部分)。
  3. 再次 更新 数据库条目,使用update(push)把新加的项目推送到 mystuff 列表里。
  4. 最后,再次 更新 数据库条目,使用“push_all”修改器和 oldlist 变量,把旧的内容推回到 mystuff 列表里。

看起来“pull_all”需要某种修改器,但我真搞不清楚它到底想要什么。

有没有人有什么想法?当然,理想的情况是能在 update() 中添加一个“insert_at”修改器,但这我无能为力。生活就是这么刺激,等等。

1 个回答

1

pull_all 是一个可以从列表中移除多个元素的功能。根据你的情况,我认为你要移除的就是 oldlist

不过,我觉得更好的方法是先用 get 把整个文档取出来,然后在客户端代码中修改 mystuff 这个字段,最后再用 save 把修改后的内容保存回去。

正如你所提到的,直接在文档中更新的工具是有限的。

撰写回答