在Python/Mongoengine中使用pull_all和push_all
我在Mongo数据库里有一个对象:
mystuff = ListField(ReferenceField(Asset, dbref=True))
我有一个Python方法,目的是要 更新 这个Mongo对象,把它的 mystuff 列表字段的值前面加上一个给定的值。因为Mongoengine目前还没有办法在列表的特定位置插入一个对象(而且他们把这个功能的优先级定得很低),所以我尝试了以下步骤:
- 把当前列表的内容保存到一个临时变量(oldlist)里。
- 使用“pull_all”这个修改器来 更新 数据库条目,把 mystuff 列表清空(这个修改器是 mongoengine的一部分)。
- 再次 更新 数据库条目,使用update(push)把新加的项目推送到 mystuff 列表里。
- 最后,再次 更新 数据库条目,使用“push_all”修改器和 oldlist 变量,把旧的内容推回到 mystuff 列表里。
看起来“pull_all”需要某种修改器,但我真搞不清楚它到底想要什么。
有没有人有什么想法?当然,理想的情况是能在 update() 中添加一个“insert_at”修改器,但这我无能为力。生活就是这么刺激,等等。
1 个回答
1
pull_all
是一个可以从列表中移除多个元素的功能。根据你的情况,我认为你要移除的就是 oldlist
。
不过,我觉得更好的方法是先用 get
把整个文档取出来,然后在客户端代码中修改 mystuff
这个字段,最后再用 save
把修改后的内容保存回去。
正如你所提到的,直接在文档中更新的工具是有限的。