如何在Flask中使用MongoEngine一次添加多个MongoDB文档条目?

1 投票
2 回答
2560 浏览
提问于 2025-04-18 04:13

我想知道如何在Flask中使用MongoEngine/Flask-MongoEngine一次性添加多个条目到文档里。

我尝试过遍历一个包含我条目的字典。我把例子简化了一下,但最开始的数据是我从Wordpress导出的RSS文件,然后我用feedparser解析了它。

但显然问题是,我无法在保存到数据库之前动态生成保存条目的变量。

这是我到目前为止尝试的内容。

我该如何批量将条目添加到我的MongoDB数据库中?

# model
class Entry(db.Document):
    created_at = db.DateTimeField(
        default=datetime.datetime.now, required=True),
    title = db.StringField(max_length=255, required=True)
    link = db.StringField(required=True)

# dictionary with entries
e = {'entries': [{'title': u'title1',
                  'link': u'http://www.me.com'
                  },
    {'title': u'title2',
     'link': u'http://www.me.com/link/'
     }
]
}

# multiple entries via views
i = 0
while i<len(e['entries']):
      post[i] = Entry(title=e['entries'][i]['title'], link=e['entries'][i]['title'])
      post[i].save();
      i += 1

编辑 1:

我考虑过完全跳过变量,直接把字典转换成mongoengine能理解的格式。

因为当我手动创建一个列表时,我可以批量将它们输入到MongoDB中:

newList = [RSSPost(title="test1", link="http://www.google.de"),
            RSSPost(title="test2", link="http://www.test2.com")]

RSSPost.objects.insert(newList)

这个方法有效,但我无法完全将其转化为我的问题。

我尝试了

f = []

for x in e['entries']:
    f.append("insert " + x['link'] + " and " + x['title'])

但正如你所看到的,我无法重新创建我需要的列表。

我该如何正确地做到这一点?

2 个回答

2

快速简单的方法:

for i in e['entries']:
    new_e = Entry(**i)
    new_e.save()
4
# dictionary with entries
e = {'entries': [{'title': u'title1',
                  'link': u'http://www.me.com'
                  },
    {'title': u'title2',
     'link': u'http://www.me.com/link/'
     }
]
}

你的数据或情况和你发布的例子有什么不同呢?只要我没有漏掉什么,你应该可以像这样创建 Entry 对象:

entries = []
for entry in e['entries']:
    new_entry = Entry(title=entry['title'], link=entry['link'])
    entries.append(new_entry)

Entry.objects.insert(entries)

撰写回答