如何在MongoEngine中向另一个EmbeddedDocument内的EmbeddedDocument推送数据?

3 投票
1 回答
901 浏览
提问于 2025-04-16 19:45

我的应用程序是一个简单的待办事项列表,这里是我用MongoEngine写的类...

class Task(EmbeddedDocument):
    content = StringField()
    slug = StringField()
    position = IntField()
    priority = IntField()
    status = IntField()

class List(EmbeddedDocument):
    name = StringField()
    slug = StringField()
    tasks = ListField(EmbeddedDocumentField(Task))

class User(Document):
    email = StringField()
    twitter = StringField()
    lists = ListField(EmbeddedDocumentField(List))

我通过以下方式将任务添加到用户的列表中...

list = List()
list.name = request.form['name']
list.slug = slugify(request.form['name'])
User.objects(twitter=session['username']).update_one(push__lists=list)

逻辑是用户可以有多个列表,而每个列表可以包含多个任务。

现在我想在某个特定的列表中添加一个任务,但我找不到用MongoEngine实现的方法。我的思路可能是这样的:

User.objects(twitter=session['username']).update_one(push__lists__listname__task=list)

那么,正确的做法是什么呢?

1 个回答

2

目前,这个操作在MongoDB或MongoEngine中都不支持。

MongoEngine的开发版本对$位置操作符有一些支持,但MongoDB只允许每次更新时使用一次位置操作符。这意味着你不能用它来更新嵌套在列表中的列表(即使是间接的,像你举的例子那样)。

如果你需要对待办事项列表进行原子更新(也就是确保更新的完整性),你应该重新考虑一下你的数据模型,以便支持这种操作。

撰写回答